/ Hex Artifact Content
Login

Artifact 5b5a980aec52a3864bba8600c003b6ad6f4112c2:


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 32  : pager.c,v 1.62
0350: 39 20 32 30 30 39 2f 30 38 2f 31 30 20 31 37 3a  9 2009/08/10 17:
0360: 34 38 3a 35 37 20 64 72 68 20 45 78 70 20 24 0a  48:57 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72  t.h"../*.** Macr
03b0: 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68  os for troublesh
03c0: 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61 6c 6c  ooting.  Normall
03d0: 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a  y turned off.*/.
03e0: 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69 74 65  #if 0.int sqlite
03f0: 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b 20 20  3PagerTrace=1;  
0400: 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61 62 6c  /* True to enabl
0410: 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 64 65  e tracing */.#de
0420: 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65 62 75  fine sqlite3Debu
0430: 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66 0a 23  gPrintf printf.#
0440: 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43  define PAGERTRAC
0450: 45 28 58 29 20 20 20 20 20 69 66 28 20 73 71 6c  E(X)     if( sql
0460: 69 74 65 33 50 61 67 65 72 54 72 61 63 65 20 29  ite3PagerTrace )
0470: 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72  { sqlite3DebugPr
0480: 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73 65 0a  intf X; }.#else.
0490: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
04a0: 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  CE(X).#endif../*
04b0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
04c0: 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61 72 65  g two macros are
04d0: 20 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65   used within the
04e0: 20 50 41 47 45 52 54 52 41 43 45 28 29 20 6d 61   PAGERTRACE() ma
04f0: 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f  cros above.** to
0500: 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d   print out file-
0510: 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a  descriptors. .**
0520: 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20 74 61  .** PAGERID() ta
0530: 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  kes a pointer to
0540: 20 61 20 50 61 67 65 72 20 73 74 72 75 63 74 20   a Pager struct 
0550: 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74 2e  as its argument.
0560: 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74   The.** associat
0570: 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ed file-descript
0580: 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  or is returned. 
0590: 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29 20 74  FILEHANDLEID() t
05a0: 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65 33 5f  akes an sqlite3_
05b0: 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 20 61  file.** struct a
05c0: 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74 2e 0a  s its argument..
05d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
05e0: 49 44 28 70 29 20 28 28 69 6e 74 29 28 70 2d 3e  ID(p) ((int)(p->
05f0: 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46 49 4c  fd)).#define FIL
0600: 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28 28  EHANDLEID(fd) ((
0610: 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54  int)fd)../*.** T
0620: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73  he page cache as
0630: 20 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61   a whole is alwa
0640: 79 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  ys in one of the
0650: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74   following.** st
0660: 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41  ates:.**.**   PA
0670: 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20  GER_UNLOCK      
0680: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
0690: 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
06a0: 79 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a  y reading or .**
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06c0: 20 20 20 20 20 20 20 77 72 69 74 69 6e 67 20 74         writing t
06d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
06e0: 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a  .  There is no.*
06f0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0700: 20 20 20 20 20 20 20 20 64 61 74 61 20 68 65 6c          data hel
0710: 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68  d in memory.  Th
0720: 69 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  is is the initia
0730: 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
0740: 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65             state
0750: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0760: 53 48 41 52 45 44 20 20 20 20 20 20 20 20 54 68  SHARED        Th
0770: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0780: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0790: 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  base..**        
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
07b0: 72 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65  riting is not pe
07c0: 72 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20  rmitted.  There 
07d0: 63 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20  can be.**       
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73  multiple readers
0800: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73   accessing the s
0810: 61 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ame database.** 
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68        file at th
0840: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a  e same time..**.
0850: 2a 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52  **   PAGER_RESER
0860: 56 45 44 20 20 20 20 20 20 54 68 69 73 20 70 72  VED      This pr
0870: 6f 63 65 73 73 20 68 61 73 20 72 65 73 65 72 76  ocess has reserv
0880: 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
0890: 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20  for writing.**  
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 20 20 20 62 75 74 20 68 61 73 20 6e 6f 74       but has not
08c0: 20 79 65 74 20 6d 61 64 65 20 61 6e 79 20 63 68   yet made any ch
08d0: 61 6e 67 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65  anges.  Only one
08e0: 20 70 72 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20   process.**     
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 61 74 20 61 20 74 69 6d 65 20 63 61 6e 20    at a time can 
0910: 72 65 73 65 72 76 65 20 74 68 65 20 64 61 74 61  reserve the data
0920: 62 61 73 65 2e 20 20 54 68 65 20 6f 72 69 67 69  base.  The origi
0930: 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  nal.**          
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0950: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e  abase file has n
0960: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
0970: 20 73 6f 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20   so other.**    
0980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0990: 20 20 20 70 72 6f 63 65 73 73 65 73 20 6d 61 79     processes may
09a0: 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e   still be readin
09b0: 67 20 74 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a  g the on-disk.**
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09d0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
09e0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  file..**.**   PA
09f0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20  GER_EXCLUSIVE   
0a00: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
0a10: 20 69 73 20 77 72 69 74 69 6e 67 20 74 68 65 20   is writing the 
0a20: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20  database..**    
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a40: 20 20 20 41 63 63 65 73 73 20 69 73 20 65 78 63     Access is exc
0a50: 6c 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65  lusive.  No othe
0a60: 72 20 70 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a  r processes or.*
0a70: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0a80: 20 20 20 20 20 20 20 20 74 68 72 65 61 64 73 20          threads 
0a90: 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 6f  can be reading o
0aa0: 72 20 77 72 69 74 69 6e 67 20 77 68 69 6c 65 20  r writing while 
0ab0: 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  one.**          
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f               pro
0ad0: 63 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 2e  cess is writing.
0ae0: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53  .**.**   PAGER_S
0af0: 59 4e 43 45 44 20 20 20 20 20 20 20 20 54 68 65  YNCED        The
0b00: 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20   pager moves to 
0b10: 74 68 69 73 20 73 74 61 74 65 20 66 72 6f 6d 20  this state from 
0b20: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 0a  PAGER_EXCLUSIVE.
0b30: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0b40: 20 20 20 20 20 20 20 20 20 61 66 74 65 72 20 61           after a
0b50: 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 68  ll dirty pages h
0b60: 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
0b70: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
0ba0: 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  nd the file has 
0bb0: 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a  been synced to.*
0bc0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0bd0: 20 20 20 20 20 20 20 20 64 69 73 6b 2e 20 41 6c          disk. Al
0be0: 6c 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74  l that remains t
0bf0: 6f 20 64 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76  o do is to remov
0c00: 65 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  e or.**         
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
0c20: 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
0c30: 61 6c 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  al file and the 
0c40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c60: 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20 63 6f        will be co
0c70: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  mmitted..**.** T
0c80: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 63 6f  he page cache co
0c90: 6d 65 73 20 75 70 20 69 6e 20 50 41 47 45 52 5f  mes up in PAGER_
0ca0: 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72  UNLOCK.  The fir
0cb0: 73 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c  st time a.** sql
0cc0: 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 6f  ite3PagerGet() o
0cd0: 63 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65  ccurs, the state
0ce0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20   transitions to 
0cf0: 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a  PAGER_SHARED..**
0d00: 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73   After all pages
0d10: 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61   have been relea
0d20: 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  sed using sqlite
0d30: 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a  _page_unref(),.*
0d40: 2a 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e  * the state tran
0d50: 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20  sitions back to 
0d60: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54  PAGER_UNLOCK.  T
0d70: 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a  he first time.**
0d80: 20 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67   that sqlite3Pag
0d90: 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
0da0: 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65 20 74  led, the state t
0db0: 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a  ransitions to.**
0dc0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
0dd0: 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73 71 6c    (Note that sql
0de0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
0df0: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20   can only be.** 
0e00: 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74  called on an out
0e10: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 77 68  standing page wh
0e20: 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ich means that t
0e30: 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a  he pager must.**
0e40: 20 62 65 20 69 6e 20 50 41 47 45 52 5f 53 48 41   be in PAGER_SHA
0e50: 52 45 44 20 62 65 66 6f 72 65 20 69 74 20 74 72  RED before it tr
0e60: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47  ansitions to PAG
0e70: 45 52 5f 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a  ER_RESERVED.).**
0e80: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
0e90: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65  means that there
0ea0: 20 69 73 20 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c   is an open roll
0eb0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  back journal..**
0ec0: 20 54 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20   The transition 
0ed0: 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  to PAGER_EXCLUSI
0ee0: 56 45 20 6f 63 63 75 72 73 20 62 65 66 6f 72 65  VE occurs before
0ef0: 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20   any changes.** 
0f00: 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
0f10: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
0f20: 68 6f 75 67 68 20 77 72 69 74 65 73 20 74 6f 20  hough writes to 
0f30: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  the rollback.** 
0f40: 6a 6f 75 72 6e 61 6c 20 6f 63 63 75 72 73 20 77  journal occurs w
0f50: 69 74 68 20 6a 75 73 74 20 50 41 47 45 52 5f 52  ith just PAGER_R
0f60: 45 53 45 52 56 45 44 2e 20 20 41 66 74 65 72 20  ESERVED.  After 
0f70: 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  an sqlite3PagerR
0f80: 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20  ollback().** or 
0f90: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
0fa0: 69 74 50 68 61 73 65 54 77 6f 28 29 2c 20 74 68  itPhaseTwo(), th
0fb0: 65 20 73 74 61 74 65 20 63 61 6e 20 67 6f 20 62  e state can go b
0fc0: 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ack to PAGER_SHA
0fd0: 52 45 44 2c 0a 2a 2a 20 6f 72 20 69 74 20 63 61  RED,.** or it ca
0fe0: 6e 20 73 74 61 79 20 61 74 20 50 41 47 45 52 5f  n stay at PAGER_
0ff0: 45 58 43 4c 55 53 49 56 45 20 69 66 20 77 65 20  EXCLUSIVE if we 
1000: 61 72 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65  are in exclusive
1010: 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f   access mode..*/
1020: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 55  .#define PAGER_U
1030: 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23 64 65  NLOCK      0.#de
1040: 66 69 6e 65 20 50 41 47 45 52 5f 53 48 41 52 45  fine PAGER_SHARE
1050: 44 20 20 20 20 20 20 31 20 20 20 2f 2a 20 73 61  D      1   /* sa
1060: 6d 65 20 61 73 20 53 48 41 52 45 44 5f 4c 4f 43  me as SHARED_LOC
1070: 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  K */.#define PAG
1080: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 32  ER_RESERVED    2
1090: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 52 45     /* same as RE
10a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23  SERVED_LOCK */.#
10b0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 58 43  define PAGER_EXC
10c0: 4c 55 53 49 56 45 20 20 20 34 20 20 20 2f 2a 20  LUSIVE   4   /* 
10d0: 73 61 6d 65 20 61 73 20 45 58 43 4c 55 53 49 56  same as EXCLUSIV
10e0: 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e  E_LOCK */.#defin
10f0: 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20  e PAGER_SYNCED  
1100: 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 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: 36 34 4b 69 42 2e 20 49 66 20 74 68 65 20 78 53  64KiB. If the xS
12d0: 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74 68  ectorsize() meth
12e0: 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61  od .** returns a
12f0: 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74 68   value larger th
1300: 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d 41  an this, then MA
1310: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 73  X_SECTOR_SIZE is
1320: 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a   used instead..*
1330: 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f 6e  * This could con
1340: 63 65 69 76 61 62 6c 79 20 63 61 75 73 65 20 63  ceivably cause c
1350: 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f 77  orruption follow
1360: 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ing a power fail
1370: 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20 61  ure on.** such a
1380: 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69 73   system. This is
1390: 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75 6e   currently an un
13a0: 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69 74  documented limit
13b0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58  ..*/.#define MAX
13c0: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78 31  _SECTOR_SIZE 0x1
13d0: 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  0000../*.** An i
13e0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
13f0: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
1400: 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  re is allocated 
1410: 66 6f 72 20 65 61 63 68 20 61 63 74 69 76 65 0a  for each active.
1420: 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61 6e 64  ** savepoint and
1430: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
1440: 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 79  action in the sy
1450: 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68 20 73  stem. All such s
1460: 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61 72 65  tructures.** are
1470: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 50   stored in the P
1480: 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b  ager.aSavepoint[
1490: 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68 20 69  ] array, which i
14a0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 0a  s allocated and.
14b0: 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69 6e 67  ** resized using
14c0: 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28   sqlite3Realloc(
14d0: 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20  )..**.** When a 
14e0: 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63 72 65  savepoint is cre
14f0: 61 74 65 64 2c 20 74 68 65 20 50 61 67 65 72 53  ated, the PagerS
1500: 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
1510: 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a 2a 20  set field is.** 
1520: 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61 20 6a  set to 0. If a j
1530: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73  ournal-header is
1540: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1550: 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 77  e main journal w
1560: 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61 76 65  hile.** the save
1570: 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2c  point is active,
1580: 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73 65 74   then iHdrOffset
1590: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 62   is set to the b
15a0: 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a 20 69  yte offset .** i
15b0: 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
15c0: 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 6a 6f  wing the last jo
15d0: 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 72 69  urnal record wri
15e0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d 61  tten into the ma
15f0: 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 62 65  in.** journal be
1600: 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fore the journal
1610: 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20 69 73  -header. This is
1620: 20 72 65 71 75 69 72 65 64 20 64 75 72 69 6e 67   required during
1630: 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 72 6f   savepoint.** ro
1640: 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61 67 65  llback (see page
1650: 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69  rPlaybackSavepoi
1660: 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65 64 65  nt())..*/.typede
1670: 66 20 73 74 72 75 63 74 20 50 61 67 65 72 53 61  f struct PagerSa
1680: 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53 61 76  vepoint PagerSav
1690: 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74 20 50  epoint;.struct P
16a0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 7b 0a  agerSavepoint {.
16b0: 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b 20 20    i64 iOffset;  
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16d0: 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66 73 65  * Starting offse
16e0: 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61  t in main journa
16f0: 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  l */.  i64 iHdrO
1700: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
1710: 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f 76 65      /* See above
1720: 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 49   */.  Bitvec *pI
1730: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20  nSavepoint;     
1740: 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70 61 67     /* Set of pag
1750: 65 73 20 69 6e 20 74 68 69 73 20 73 61 76 65 70  es in this savep
1760: 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  oint */.  Pgno n
1770: 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20 20  Orig;           
1780: 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
1790: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
17a0: 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a 20 20  es in file */.  
17b0: 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20 20 20  Pgno iSubRec;   
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17d0: 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 72  Index of first r
17e0: 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a 6f 75  ecord in sub-jou
17f0: 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  rnal */.};../*.*
1800: 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61  * A open page ca
1810: 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  che is an instan
1820: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
1830: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
1840: 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a  *.** errCode.**.
1850: 2a 2a 20 20 20 50 61 67 65 72 2e 65 72 72 43 6f  **   Pager.errCo
1860: 64 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  de may be set to
1870: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53   SQLITE_IOERR, S
1880: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f  QLITE_CORRUPT, o
1890: 72 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49 54 45  r.**   or SQLITE
18a0: 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20  _FULL. Once one 
18b0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72  of the first thr
18c0: 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73  ee errors occurs
18d0: 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a  , it persists.**
18e0: 20 20 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e     and is return
18f0: 65 64 20 61 73 20 74 68 65 20 72 65 73 75 6c 74  ed as the result
1900: 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20   of every major 
1910: 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20  pager API call. 
1920: 20 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49 54 45   The.**   SQLITE
1930: 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64  _FULL return cod
1940: 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69  e is slightly di
1950: 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73  fferent. It pers
1960: 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20  ists only until 
1970: 74 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20 73 75  the.**   next su
1980: 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63  ccessful rollbac
1990: 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f  k is performed o
19a0: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
19b0: 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20 53 51  e. Also,.**   SQ
19c0: 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e  LITE_FULL does n
19d0: 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71  ot affect the sq
19e0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
19f0: 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
1a00: 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20 41 50  Lookup().**   AP
1a10: 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69  Is, they may sti
1a20: 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63 63 65  ll be used succe
1a30: 73 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 64  ssfully..**.** d
1a40: 62 53 69 7a 65 56 61 6c 69 64 2c 20 64 62 53 69  bSizeValid, dbSi
1a50: 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 2c 20  ze, dbOrigSize, 
1a60: 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a 2a 2a  dbFileSize.**.**
1a70: 20 20 20 4d 61 6e 61 67 69 6e 67 20 74 68 65 20     Managing the 
1a80: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1a90: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67  base file in pag
1aa0: 65 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20 63  es is a little c
1ab0: 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 20 20  omplicated..**  
1ac0: 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61   The variable Pa
1ad0: 67 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e 74 61  ger.dbSize conta
1ae0: 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ins the number o
1af0: 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68 65  f pages that the
1b00: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 69   database.**   i
1b10: 6d 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 63  mage currently c
1b20: 6f 6e 74 61 69 6e 73 2e 20 41 73 20 74 68 65 20  ontains. As the 
1b30: 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 67  database image g
1b40: 72 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b 73 20  rows or shrinks 
1b50: 74 68 69 73 0a 2a 2a 20 20 20 76 61 72 69 61 62  this.**   variab
1b60: 6c 65 20 69 73 20 75 70 64 61 74 65 64 2e 20 54  le is updated. T
1b70: 68 65 20 76 61 72 69 61 62 6c 65 20 50 61 67 65  he variable Page
1b80: 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e  r.dbFileSize con
1b90: 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  tains the number
1ba0: 0a 2a 2a 20 20 20 6f 66 20 70 61 67 65 73 20 69  .**   of pages i
1bb0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1bc0: 69 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 62 65  ile. This may be
1bd0: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
1be0: 50 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a 2a 20  Pager.dbSize.** 
1bf0: 20 20 69 66 20 73 6f 6d 65 20 70 61 67 65 73 20    if some pages 
1c00: 68 61 76 65 20 62 65 65 6e 20 61 70 70 65 6e 64  have been append
1c10: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
1c20: 73 65 20 69 6d 61 67 65 20 62 75 74 20 6e 6f 74  se image but not
1c30: 20 79 65 74 20 77 72 69 74 74 65 6e 0a 2a 2a 20   yet written.** 
1c40: 20 20 6f 75 74 20 66 72 6f 6d 20 74 68 65 20 63    out from the c
1c50: 61 63 68 65 20 74 6f 20 74 68 65 20 61 63 74 75  ache to the actu
1c60: 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  al file on disk.
1c70: 20 4f 72 20 69 66 20 74 68 65 20 69 6d 61 67 65   Or if the image
1c80: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 74   has been.**   t
1c90: 72 75 6e 63 61 74 65 64 20 62 79 20 61 6e 20 69  runcated by an i
1ca0: 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
1cb0: 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65  m operation. The
1cc0: 20 50 61 67 65 72 2e 64 62 4f 72 69 67 53 69 7a   Pager.dbOrigSiz
1cd0: 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20  e variable.**   
1ce0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d  contains the num
1cf0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1d00: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
1d10: 67 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ge when the curr
1d20: 65 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73 61 63  ent.**   transac
1d30: 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e  tion was opened.
1d40: 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   The contents of
1d50: 20 61 6c 6c 20 74 68 72 65 65 20 6f 66 20 74 68   all three of th
1d60: 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 69 73  ese variables is
1d70: 0a 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61 72 61  .**   only guara
1d80: 6e 74 65 65 64 20 74 6f 20 62 65 20 63 6f 72 72  nteed to be corr
1d90: 65 63 74 20 69 66 20 74 68 65 20 62 6f 6f 6c 65  ect if the boole
1da0: 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 56  an Pager.dbSizeV
1db0: 61 6c 69 64 20 69 73 20 74 72 75 65 2e 0a 2a 2a  alid is true..**
1dc0: 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e 64 65  .**   TODO: Unde
1dd0: 72 20 77 68 61 74 20 63 6f 6e 64 69 74 69 6f 6e  r what condition
1de0: 73 20 69 73 20 64 62 53 69 7a 65 56 61 6c 69 64  s is dbSizeValid
1df0: 20 73 65 74 3f 20 43 6c 65 61 72 65 64 3f 0a 2a   set? Cleared?.*
1e00: 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74  *.** changeCount
1e10: 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  Done.**.**   Thi
1e20: 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  s boolean variab
1e30: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  le is used to ma
1e40: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
1e50: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1e60: 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74  .**   (the 4-byt
1e70: 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61  e header field a
1e80: 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  t byte offset 24
1e90: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1ea0: 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20   file) is .**   
1eb0: 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65  not updated more
1ec0: 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65   often than nece
1ed0: 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ssary. .**.**   
1ee0: 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  It is set to tru
1ef0: 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67  e when the chang
1f00: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20  e-counter field 
1f10: 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63  is updated, whic
1f20: 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79  h .**   can only
1f30: 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78   happen if an ex
1f40: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
1f50: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1f60: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
1f70: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73  It is cleared (s
1f80: 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65  et to false) whe
1f90: 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69  never an exclusi
1fa0: 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20  ve lock is .**  
1fb0: 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e   relinquished on
1fc0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1fd0: 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20  le. Each time a 
1fe0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
1ff0: 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54  ommitted,.**   T
2000: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
2010: 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65  ne flag is inspe
2020: 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74  cted. If it is t
2030: 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66  rue, the work of
2040: 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74  .**   updating t
2050: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2060: 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72  r is omitted for
2070: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
2080: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
2090: 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d    This mechanism
20a0: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e   means that when
20b0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
20c0: 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f  usive mode, a co
20d0: 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e  nnection .**   n
20e0: 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20  eed only update 
20f0: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
2100: 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65  er once, for the
2110: 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69   first transacti
2120: 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65  on.**   committe
2130: 64 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64 69 66  d..**.** dbModif
2140: 69 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ied.**.**   The 
2150: 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67 20  dbModified flag 
2160: 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20  is set whenever 
2170: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
2180: 69 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a 20 20  is dirtied..**  
2190: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 61   It is cleared a
21a0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63  t the end of eac
21b0: 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  h transaction..*
21c0: 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 75 73 65  *.**   It is use
21d0: 64 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  d when committin
21e0: 67 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20 65  g or otherwise e
21f0: 6e 64 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  nding a transact
2200: 69 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74 68 65  ion. If.**   the
2210: 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67   dbModified flag
2220: 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 6c   is clear then l
2230: 65 73 73 20 77 6f 72 6b 20 68 61 73 20 74 6f 20  ess work has to 
2240: 62 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 6a  be done..**.** j
2250: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 0a 2a 2a  ournalStarted.**
2260: 0a 2a 2a 20 20 20 54 68 69 73 20 66 6c 61 67 20  .**   This flag 
2270: 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20  is set whenever 
2280: 74 68 65 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  the the main jou
2290: 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2e 20  rnal is synced. 
22a0: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 70 6f 69  .**.**   The poi
22b0: 6e 74 20 6f 66 20 74 68 69 73 20 66 6c 61 67 20  nt of this flag 
22c0: 69 73 20 74 68 61 74 20 69 74 20 6d 75 73 74 20  is that it must 
22d0: 62 65 20 73 65 74 20 61 66 74 65 72 20 74 68 65  be set after the
22e0: 20 0a 2a 2a 20 20 20 66 69 72 73 74 20 6a 6f 75   .**   first jou
22f0: 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 61  rnal header in a
2300: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
2310: 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  s been synced to
2320: 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41 66 74 65   disk..**   Afte
2330: 72 20 74 68 69 73 20 68 61 73 20 68 61 70 70 65  r this has happe
2340: 6e 65 64 2c 20 6e 65 77 20 70 61 67 65 73 20 61  ned, new pages a
2350: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 64  ppended to the d
2360: 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 64 6f  atabase .**   do
2370: 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20 50 47   not need the PG
2380: 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
2390: 61 67 20 73 65 74 2c 20 61 73 20 74 68 65 79 20  ag set, as they 
23a0: 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a 20 20  do not need.**  
23b0: 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61 20 6a   to wait for a j
23c0: 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62 65 66 6f  ournal sync befo
23d0: 72 65 20 74 68 65 79 20 63 61 6e 20 62 65 20 77  re they can be w
23e0: 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 2a 2a  ritten out to.**
23f0: 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20     the database 
2400: 66 69 6c 65 20 28 73 65 65 20 66 75 6e 63 74 69  file (see functi
2410: 6f 6e 20 70 61 67 65 72 5f 77 72 69 74 65 28 29  on pager_write()
2420: 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73 65 74 4d  )..**   .** setM
2430: 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 54 68  aster.**.**   Th
2440: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  is variable is u
2450: 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  sed to ensure th
2460: 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  at the master jo
2470: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 0a  urnal file name.
2480: 2a 2a 20 20 20 28 69 66 20 61 6e 79 29 20 69 73  **   (if any) is
2490: 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e 20 69 6e   only written in
24a0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
24b0: 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  ile once..**.** 
24c0: 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e    When committin
24d0: 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  g a transaction,
24e0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
24f0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 28 69  nal file name (i
2500: 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d 61 79 20  f any).**   may 
2510: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
2520: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2530: 20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65 72   while the pager
2540: 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a 2a 2a 20   is still in.** 
2550: 20 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44    PAGER_RESERVED
2560: 20 73 74 61 74 65 20 28 73 65 65 20 43 6f 6d 6d   state (see Comm
2570: 69 74 50 68 61 73 65 4f 6e 65 28 29 20 66 6f 72  itPhaseOne() for
2580: 20 74 68 65 20 61 63 74 69 6f 6e 29 2e 20 49 74   the action). It
2590: 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74 74 65 6d  .**   then attem
25a0: 70 74 73 20 74 6f 20 75 70 67 72 61 64 65 20 74  pts to upgrade t
25b0: 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  o an exclusive l
25c0: 6f 63 6b 2e 20 49 66 20 74 68 69 73 20 61 74 74  ock. If this att
25d0: 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69 6c 73 2c  empt.**   fails,
25e0: 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 42 55 53   then SQLITE_BUS
25f0: 59 20 6d 61 79 20 62 65 20 72 65 74 75 72 6e 65  Y may be returne
2600: 64 20 74 6f 20 74 68 65 20 75 73 65 72 20 61 6e  d to the user an
2610: 64 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 20 20  d the user.**   
2620: 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f 20 63  may attempt to c
2630: 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
2640: 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61 74 65  ction again late
2650: 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a 20 20 20  r (calling.**   
2660: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
2670: 20 61 67 61 69 6e 29 2e 20 54 68 69 73 20 66 6c   again). This fl
2680: 61 67 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e  ag is used to en
2690: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 0a 2a  sure that the .*
26a0: 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  *   master journ
26b0: 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e 6c 79 20  al name is only 
26c0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
26d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20  ournal file the 
26e0: 66 69 72 73 74 0a 2a 2a 20 20 20 74 69 6d 65 20  first.**   time 
26f0: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
2700: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
2710: 2a 20 64 6f 4e 6f 74 53 79 6e 63 0a 2a 2a 0a 2a  * doNotSync.**.*
2720: 2a 20 20 20 54 68 69 73 20 76 61 72 69 61 62 6c  *   This variabl
2730: 65 20 69 73 20 73 65 74 20 61 6e 64 20 63 6c 65  e is set and cle
2740: 61 72 65 64 20 62 79 20 73 71 6c 69 74 65 33 50  ared by sqlite3P
2750: 61 67 65 72 57 72 69 74 65 28 29 2e 0a 2a 2a 0a  agerWrite()..**.
2760: 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a 0a 2a  ** needSync.**.*
2770: 2a 20 20 20 54 4f 44 4f 3a 20 49 74 20 6d 69 67  *   TODO: It mig
2780: 68 74 20 62 65 20 65 61 73 69 65 72 20 74 6f 20  ht be easier to 
2790: 73 65 74 20 74 68 69 73 20 76 61 72 69 61 62 6c  set this variabl
27a0: 65 20 69 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61  e in writeJourna
27b0: 6c 48 64 72 28 29 0a 2a 2a 20 20 20 61 6e 64 20  lHdr().**   and 
27c0: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
27d0: 61 6c 28 29 20 6f 6e 6c 79 2e 20 43 68 61 6e 67  al() only. Chang
27e0: 65 20 69 74 73 20 6d 65 61 6e 69 6e 67 20 74 6f  e its meaning to
27f0: 20 22 75 6e 73 79 6e 63 65 64 20 64 61 74 61 0a   "unsynced data.
2800: 2a 2a 20 20 20 68 61 73 20 62 65 65 6e 20 77 72  **   has been wr
2810: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
2820: 72 6e 61 6c 22 2e 0a 2a 2a 0a 2a 2a 20 73 75 62  rnal"..**.** sub
2830: 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20  jInMemory.**.** 
2840: 20 20 54 68 69 73 20 69 73 20 61 20 62 6f 6f 6c    This is a bool
2850: 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20 49 66  ean variable. If
2860: 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20   true, then any 
2870: 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a 6f 75  required sub-jou
2880: 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65  rnal.**   is ope
2890: 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d  ned as an in-mem
28a0: 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ory journal file
28b0: 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68 65 6e  . If false, then
28c0: 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20   in-memory.**   
28d0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65  sub-journals are
28e0: 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 69   only used for i
28f0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 66  n-memory pager f
2900: 69 6c 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  iles..*/.struct 
2910: 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74 65  Pager {.  sqlite
2920: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
2930: 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e 63        /* OS func
2940: 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f 72  tions to use for
2950: 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63 6c   IO */.  u8 excl
2960: 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20 20  usiveMode;      
2970: 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e       /* Boolean.
2980: 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e 67   True if locking
2990: 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56 45  _mode==EXCLUSIVE
29a0: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
29b0: 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Mode;           
29c0: 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68 65 20 50    /* On of the P
29d0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
29e0: 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75  _* values */.  u
29f0: 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20  8 useJournal;   
2a00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
2a10: 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  e a rollback jou
2a20: 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c  rnal on this fil
2a30: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61 64  e */.  u8 noRead
2a40: 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  lock;           
2a50: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74     /* Do not bot
2a60: 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72 65  her to obtain re
2a70: 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20  adlocks */.  u8 
2a80: 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  noSync;         
2a90: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
2aa0: 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  ot sync the jour
2ab0: 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  nal if true */. 
2ac0: 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20   u8 fullSync;   
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ae0: 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20 6f  Do extra syncs o
2af0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  f the journal fo
2b00: 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a  r robustness */.
2b10: 20 20 75 38 20 73 79 6e 63 5f 66 6c 61 67 73 3b    u8 sync_flags;
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b30: 20 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e 4f 52   One of SYNC_NOR
2b40: 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c  MAL or SYNC_FULL
2b50: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
2b60: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2b70: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
2b80: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
2b90: 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f  le */.  u8 readO
2ba0: 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
2bb0: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
2bc0: 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
2bd0: 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d 65 6d  base */.  u8 mem
2be0: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
2bf0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
2c00: 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c   inhibit all fil
2c10: 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a 20 54  e I/O */..  /* T
2c20: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
2c30: 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f 73  ck contains thos
2c40: 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20  e class members 
2c50: 74 68 61 74 20 61 72 65 20 64 79 6e 61 6d 69 63  that are dynamic
2c60: 61 6c 6c 79 0a 20 20 2a 2a 20 6d 6f 64 69 66 69  ally.  ** modifi
2c70: 65 64 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61 6c  ed during normal
2c80: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 54 68 65   operations. The
2c90: 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c 65 73   other variables
2ca0: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
2cb0: 72 65 0a 20 20 2a 2a 20 61 72 65 20 65 69 74 68  re.  ** are eith
2cc0: 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 72 6f  er constant thro
2cd0: 75 67 68 6f 75 74 20 74 68 65 20 6c 69 66 65 74  ughout the lifet
2ce0: 69 6d 65 20 6f 66 20 74 68 65 20 70 61 67 65 72  ime of the pager
2cf0: 2c 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 75  , or else.  ** u
2d00: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 63 6f 6e  sed to store con
2d10: 66 69 67 75 72 61 74 69 6f 6e 20 70 61 72 61 6d  figuration param
2d20: 65 74 65 72 73 20 74 68 61 74 20 61 66 66 65 63  eters that affec
2d30: 74 20 74 68 65 20 77 61 79 20 74 68 65 20 70 61  t the way the pa
2d40: 67 65 72 20 0a 20 20 2a 2a 20 6f 70 65 72 61 74  ger .  ** operat
2d50: 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
2d60: 65 20 27 73 74 61 74 65 27 20 76 61 72 69 61 62  e 'state' variab
2d70: 6c 65 20 69 73 20 64 65 73 63 72 69 62 65 64 20  le is described 
2d80: 69 6e 20 6d 6f 72 65 20 64 65 74 61 69 6c 20 61  in more detail a
2d90: 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 0a 20 20  long with the.  
2da0: 2a 2a 20 64 65 73 63 72 69 70 74 69 6f 6e 73 20  ** descriptions 
2db0: 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20 69 74  of the values it
2dc0: 20 6d 61 79 20 74 61 6b 65 20 2d 20 50 41 47 45   may take - PAGE
2dd0: 52 5f 55 4e 4c 4f 43 4b 20 65 74 63 2e 20 4d 61  R_UNLOCK etc. Ma
2de0: 6e 79 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6f  ny of the.  ** o
2df0: 74 68 65 72 20 76 61 72 69 61 62 6c 65 73 20 69  ther variables i
2e00: 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65  n this block are
2e10: 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68   described in th
2e20: 65 20 63 6f 6d 6d 65 6e 74 20 64 69 72 65 63 74  e comment direct
2e30: 6c 79 20 0a 20 20 2a 2a 20 61 62 6f 76 65 20 74  ly .  ** above t
2e40: 68 69 73 20 63 6c 61 73 73 20 64 65 66 69 6e 69  his class defini
2e50: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 75 38 20  tion..  */.  u8 
2e60: 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20  state;          
2e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
2e80: 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45  R_UNLOCK, _SHARE
2e90: 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74  D, _RESERVED, et
2ea0: 63 2e 20 2a 2f 0a 20 20 75 38 20 64 62 4d 6f 64  c. */.  u8 dbMod
2eb0: 69 66 69 65 64 3b 20 20 20 20 20 20 20 20 20 20  ified;          
2ec0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
2ed0: 68 65 72 65 20 61 72 65 20 61 6e 79 20 63 68 61  here are any cha
2ee0: 6e 67 65 73 20 74 6f 20 74 68 65 20 44 62 20 2a  nges to the Db *
2ef0: 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b  /.  u8 needSync;
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f10: 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66 73  /* True if an fs
2f20: 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64 20  ync() is needed 
2f30: 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  on the journal *
2f40: 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74  /.  u8 journalSt
2f50: 61 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20  arted;          
2f60: 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61 64 65  /* True if heade
2f70: 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20  r of journal is 
2f80: 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20 63  synced */.  u8 c
2f90: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
2fa0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
2fb0: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
2fc0: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
2fd0: 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65 74  nter */.  u8 set
2fe0: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
2ff0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3000: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
3010: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
3020: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
3030: 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  otSync;         
3040: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
3050: 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20 64 6f  . While true, do
3060: 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63   not spill the c
3070: 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 64 62 53  ache */.  u8 dbS
3080: 69 7a 65 56 61 6c 69 64 3b 20 20 20 20 20 20 20  izeValid;       
3090: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 77 68 65        /* Set whe
30a0: 6e 20 64 62 53 69 7a 65 20 69 73 20 63 6f 72 72  n dbSize is corr
30b0: 65 63 74 20 2a 2f 0a 20 20 75 38 20 73 75 62 6a  ect */.  u8 subj
30c0: 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20 20 20  InMemory;       
30d0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
30e0: 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 75  use in-memory su
30f0: 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20  b-journals */.  
3100: 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20 20 20  Pgno dbSize;    
3110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3120: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
3130: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
3140: 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69 67 53  /.  Pgno dbOrigS
3150: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
3160: 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65  /* dbSize before
3170: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
3180: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 50 67  nsaction */.  Pg
3190: 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b 20 20  no dbFileSize;  
31a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
31b0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
31c0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
31d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f  e */.  int errCo
31e0: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
31f0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76     /* One of sev
3200: 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72  eral kinds of er
3210: 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  rors */.  int nR
3220: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
3230: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20 6a        /* Pages j
3240: 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63 65 20  ournalled since 
3250: 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20 77 72  last j-header wr
3260: 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32 20 63  itten */.  u32 c
3270: 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20  ksumInit;       
3280: 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d         /* Quasi-
3290: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64  random value add
32a0: 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65 63  ed to every chec
32b0: 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20 6e 53  ksum */.  u32 nS
32c0: 75 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20  ubRec;          
32d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
32e0: 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69 74 74  of records writt
32f0: 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72 6e 61  en to sub-journa
3300: 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  l */.  Bitvec *p
3310: 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  InJournal;      
3320: 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f     /* One bit fo
3330: 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74  r each page in t
3340: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
3350: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
3360: 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20 20 20  le *fd;         
3370: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
3380: 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62 61 73  ptor for databas
3390: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
33a0: 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20  ile *jfd;       
33b0: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
33c0: 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e 20 6a  iptor for main j
33d0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69  ournal */.  sqli
33e0: 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64 3b 20  te3_file *sjfd; 
33f0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
3400: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 73  descriptor for s
3410: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  ub-journal */.  
3420: 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20  i64 journalOff; 
3430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
3440: 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f 66 66  urrent write off
3450: 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  set in the journ
3460: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
3470: 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20 20   journalHdr;    
3480: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
3490: 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76 69   offset to previ
34a0: 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ous journal head
34b0: 65 72 20 2a 2f 0a 20 20 50 61 67 65 72 53 61 76  er */.  PagerSav
34c0: 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70 6f 69  epoint *aSavepoi
34d0: 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f 66 20  nt; /* Array of 
34e0: 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
34f0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 76 65  s */.  int nSave
3500: 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20  point;          
3510: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3520: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53 61 76  elements in aSav
3530: 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68  epoint[] */.  ch
3540: 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36  ar dbFileVers[16
3550: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ];        /* Cha
3560: 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61  nges whenever da
3570: 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
3580: 67 65 73 20 2a 2f 0a 20 20 75 33 32 20 73 65 63  ges */.  u32 sec
3590: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
35a0: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
35b0: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
35c0: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a  ng rollback */..
35d0: 20 20 75 31 36 20 6e 45 78 74 72 61 3b 20 20 20    u16 nExtra;   
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35f0: 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62   Add this many b
3600: 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d  ytes to each in-
3610: 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
3620: 20 69 31 36 20 6e 52 65 73 65 72 76 65 3b 20 20   i16 nReserve;  
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3640: 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64  Number of unused
3650: 20 62 79 74 65 73 20 61 74 20 65 6e 64 20 6f 66   bytes at end of
3660: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
3670: 75 33 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20  u32 vfsFlags;   
3680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
3690: 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33  lags for sqlite3
36a0: 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
36b0: 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20    int pageSize; 
36c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36d0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
36e0: 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   in a page */.  
36f0: 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20  Pgno mxPgno;    
3700: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
3710: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73  aximum allowed s
3720: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
3730: 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ase */.  char *z
3740: 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
3750: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
3760: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
3770: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f  e */.  char *zJo
3780: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
3790: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
37a0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
37b0: 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48  /.  int (*xBusyH
37c0: 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20  andler)(void*); 
37d0: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63  /* Function to c
37e0: 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a 2f  all when busy */
37f0: 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61  .  void *pBusyHa
3800: 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20 2f  ndlerArg;      /
3810: 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d 65  * Context argume
3820: 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e 64  nt for xBusyHand
3830: 6c 65 72 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ler */.#ifdef SQ
3840: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
3850: 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20 20 20  nHit, nMiss;    
3860: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65          /* Cache
3870: 20 68 69 74 73 20 61 6e 64 20 6d 69 73 73 69 6e   hits and missin
3880: 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64  g */.  int nRead
3890: 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20  , nWrite;       
38a0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70     /* Database p
38b0: 61 67 65 73 20 72 65 61 64 2f 77 72 69 74 74 65  ages read/writte
38c0: 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f  n */.#endif.  vo
38d0: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
38e0: 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c  DbPage*); /* Cal
38f0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
3900: 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61  hen reloading pa
3910: 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ges */.#ifdef SQ
3920: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
3930: 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29   void *(*xCodec)
3940: 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
3950: 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69  o,int); /* Routi
3960: 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69  ne for en/decodi
3970: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ng data */.  voi
3980: 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68  d (*xCodecSizeCh
3990: 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e  ng)(void*,int,in
39a0: 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66  t); /* Notify of
39b0: 20 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e 67   page size chang
39c0: 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  es */.  void (*x
39d0: 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a  CodecFree)(void*
39e0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
39f0: 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72  * Destructor for
3a00: 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20   the codec */.  
3a10: 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20 20  void *pCodec;   
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
3a30: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
3a40: 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f   xCodec... metho
3a50: 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63  ds */.#endif.  c
3a60: 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20  har *pTmpSpace; 
3a70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
3a80: 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74  ger.pageSize byt
3a90: 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
3aa0: 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 69 36 34  tmp use */.  i64
3ab0: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69   journalSizeLimi
3ac0: 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  t;       /* Size
3ad0: 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73 69   limit for persi
3ae0: 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69  stent journal fi
3af0: 6c 65 73 20 2a 2f 0a 20 20 50 43 61 63 68 65 20  les */.  PCache 
3b00: 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20 20  *pPCache;       
3b10: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
3b20: 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f 62  to page cache ob
3b30: 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
3b40: 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
3b50: 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  p;    /* Pointer
3b60: 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67 6f   to list of ongo
3b70: 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63 65  ing backup proce
3b80: 73 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  sses */.};../*.*
3b90: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
3ba0: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
3bb0: 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75   hold counters u
3bc0: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
3bd0: 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79  ng purposes only
3be0: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
3bf0: 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  es do not exist 
3c00: 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74  in.** a non-test
3c10: 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73  ing build.  Thes
3c20: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  e variables are 
3c30: 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e  not thread-safe.
3c40: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3c50: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
3c60: 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
3c70: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
3c80: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
3c90: 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20  pages read from 
3ca0: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
3cb0: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
3cc0: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20  count = 0;   /* 
3cd0: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
3ce0: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
3cf0: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
3d00: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
3d10: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
3d20: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
3d30: 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e  written to journ
3d40: 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50  al */.# define P
3d50: 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b  AGER_INCR(v)  v+
3d60: 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  +.#else.# define
3d70: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23   PAGER_INCR(v).#
3d80: 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a  endif..../*.** J
3d90: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67  ournal files beg
3da0: 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  in with the foll
3db0: 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69  owing magic stri
3dc0: 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a  ng.  The data.**
3dd0: 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   was obtained fr
3de0: 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20  om /dev/random. 
3df0: 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79   It is used only
3e00: 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65   as a sanity che
3e10: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20  ck..**.** Since 
3e20: 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74  version 2.8.0, t
3e30: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  he journal forma
3e40: 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74  t contains addit
3e50: 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20  ional sanity.** 
3e60: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
3e70: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f  tion.  If the po
3e80: 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20  wer fails while 
3e90: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
3ea0: 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c  eing.** written,
3eb0: 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72   semi-random gar
3ec0: 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20  bage data might 
3ed0: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f  appear in the jo
3ee0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66  urnal.** file af
3ef0: 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73  ter power is res
3f00: 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74  tored.  If an at
3f10: 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61  tempt is then ma
3f20: 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68  de.** to roll th
3f30: 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20  e journal back, 
3f40: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
3f50: 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  ld be corrupted.
3f60: 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c    The additional
3f70: 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b  .** sanity check
3f80: 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61  ing data is an a
3f90: 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76  ttempt to discov
3fa0: 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69  er the garbage i
3fb0: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
3fc0: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
3fd0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79  **.** The sanity
3fe0: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
3ff0: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65  ation for the ne
4000: 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  w journal format
4010: 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20   consists.** of 
4020: 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75  a 32-bit checksu
4030: 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f  m on each page o
4040: 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65  f data.  The che
4050: 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74  cksum covers bot
4060: 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  h.** the page nu
4070: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61  mber and the pPa
4080: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
4090: 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20  tes of data for 
40a0: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69  the page..** Thi
40b0: 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69  s cksum is initi
40c0: 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62  alized to a 32-b
40d0: 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  it random value 
40e0: 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20  that appears in 
40f0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
4100: 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20  ile right after 
4110: 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65  the header.  The
4120: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69   random initiali
4130: 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  zer is important
4140: 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72  ,.** because gar
4150: 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61  bage data that a
4160: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e  ppears at the en
4170: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69  d of a journal i
4180: 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61  s likely.** data
4190: 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69   that was once i
41a0: 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68  n other files th
41b0: 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  at have now been
41c0: 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68   deleted.  If th
41d0: 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74  e.** garbage dat
41e0: 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f  a came from an o
41f0: 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
4200: 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73  file, the checks
4210: 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ums might.** be 
4220: 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79  correct.  But by
4230: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
4240: 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61  e checksum to ra
4250: 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68  ndom value which
4260: 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74  .** is different
4270: 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e   for every journ
4280: 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20  al, we minimize 
4290: 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74  that risk..*/.st
42a0: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
42b0: 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61  ned char aJourna
42c0: 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30  lMagic[] = {.  0
42d0: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
42e0: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
42f0: 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d  1, 0x63, 0xd7,.}
4300: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ;../*.** The siz
4310: 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68  e of the of each
4320: 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20   page record in 
4330: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67  the journal is g
4340: 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66  iven by.** the f
4350: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a  ollowing macro..
4360: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
4370: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
4380: 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65    ((pPager->page
4390: 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a  Size) + 8)../*.*
43a0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
43b0: 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ader size for th
43c0: 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69  is pager. This i
43d0: 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61  s usually the sa
43e0: 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61  me .** size as a
43f0: 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
4400: 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65  tor. See also se
4410: 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a  tSectorSize()..*
4420: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
4430: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
4440: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
4450: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
4460: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
4470: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
4480: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
4490: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
44a0: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
44b0: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
44c0: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
44d0: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
44e0: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
44f0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
4500: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
4510: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
4520: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
4530: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
4540: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
4550: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
4560: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
4570: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
4580: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
4590: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
45a0: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
45b0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
45c0: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
45d0: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
45e0: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
45f0: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
4600: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
4610: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a  #ifndef NDEBUG .
4620: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a  /*.** Usage:.**.
4630: 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73 73  **   assert( ass
4640: 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
4650: 70 50 61 67 65 72 29 20 29 3b 0a 2a 2f 0a 73 74  pPager) );.*/.st
4660: 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f  atic int assert_
4670: 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65  pager_state(Page
4680: 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 2f  r *pPager){..  /
4690: 2a 20 41 20 74 65 6d 70 2d 66 69 6c 65 20 69 73  * A temp-file is
46a0: 20 61 6c 77 61 79 73 20 69 6e 20 50 41 47 45 52   always in PAGER
46b0: 5f 45 58 43 4c 55 53 49 56 45 20 6f 72 20 50 41  _EXCLUSIVE or PA
46c0: 47 45 52 5f 53 59 4e 43 45 44 20 73 74 61 74 65  GER_SYNCED state
46d0: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
46e0: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d  Pager->tempFile=
46f0: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  =0 || pPager->st
4700: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
4710: 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  SIVE );..  /* Th
4720: 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
4730: 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73  e flag is always
4740: 20 73 65 74 20 66 6f 72 20 74 65 6d 70 2d 66 69   set for temp-fi
4750: 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  les */.  assert(
4760: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
4770: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
4780: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
4790: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  );..  return 1;.
47a0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
47b0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69  Return true if i
47c0: 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
47d0: 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50  o write page *pP
47e0: 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  g into the sub-j
47f0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67  ournal..** A pag
4800: 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72  e needs to be wr
4810: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73  itten into the s
4820: 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68  ub-journal if th
4830: 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a  ere exists one.*
4840: 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73  * or more open s
4850: 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68  avepoints for wh
4860: 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  ich:.**.**   * T
4870: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
4880: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
4890: 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76  qual to PagerSav
48a0: 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e  epoint.nOrig, an
48b0: 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74  d.**   * The bit
48c0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
48d0: 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  o the page-numbe
48e0: 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a  r is not set in.
48f0: 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
4900: 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
4910: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
4920: 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  t subjRequiresPa
4930: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
4940: 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
4950: 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72  g->pgno;.  Pager
4960: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
4970: 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b  pPager;.  int i;
4980: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
4990: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
49a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65  ; i++){.    Page
49b0: 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20  rSavepoint *p = 
49c0: 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  &pPager->aSavepo
49d0: 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  int[i];.    if( 
49e0: 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26  p->nOrig>=pgno &
49f0: 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76  & 0==sqlite3Bitv
4a00: 65 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61 76  ecTest(p->pInSav
4a10: 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b  epoint, pgno) ){
4a20: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
4a30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4a40: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
4a50: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
4a60: 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  he page is alrea
4a70: 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  dy in the journa
4a80: 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  l file..*/.stati
4a90: 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72  c int pageInJour
4aa0: 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29 7b  nal(PgHdr *pPg){
4ab0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
4ac0: 33 42 69 74 76 65 63 54 65 73 74 28 70 50 67 2d  3BitvecTest(pPg-
4ad0: 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  >pPager->pInJour
4ae0: 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  nal, pPg->pgno);
4af0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
4b00: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
4b10: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66  from the given f
4b20: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
4b30: 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67   Store the integ
4b40: 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65  er.** that is re
4b50: 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65  ad in *pRes.  Re
4b60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
4b70: 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
4b80: 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72  ked, or an.** er
4b90: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
4ba0: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
4bb0: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75  ..**.** All valu
4bc0: 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e  es are stored on
4bd0: 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64   disk as big-end
4be0: 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ian..*/.static i
4bf0: 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71  nt read32bits(sq
4c00: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
4c10: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
4c20: 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e  *pRes){.  unsign
4c30: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
4c40: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
4c50: 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20  3OsRead(fd, ac, 
4c60: 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73  sizeof(ac), offs
4c70: 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  et);.  if( rc==S
4c80: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4c90: 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47  *pRes = sqlite3G
4ca0: 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d  et4byte(ac);.  }
4cb0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4cc0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
4cd0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
4ce0: 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  to a string buff
4cf0: 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e  er in big-endian
4d00: 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a   byte order..*/.
4d10: 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74  #define put32bit
4d20: 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50  s(A,B)  sqlite3P
4d30: 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42  ut4byte((u8*)A,B
4d40: 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  )../*.** Write a
4d50: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
4d60: 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66  into the given f
4d70: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
4d80: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
4d90: 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  K.** on success 
4da0: 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
4db0: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
4dc0: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
4dd0: 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62  tic int write32b
4de0: 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  its(sqlite3_file
4df0: 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *fd, i64 offset
4e00: 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68  , u32 val){.  ch
4e10: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33  ar ac[4];.  put3
4e20: 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a  2bits(ac, val);.
4e30: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
4e40: 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20  OsWrite(fd, ac, 
4e50: 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f  4, offset);.}../
4e60: 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
4e70: 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20  t to this macro 
4e80: 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  is a file descri
4e90: 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69 74  ptor (type sqlit
4ea0: 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65  e3_file*)..** Re
4eb0: 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73 20  turn 0 if it is 
4ec0: 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e  not open, or non
4ed0: 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20 31  -zero (but not 1
4ee0: 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  ) if it is..**.*
4ef0: 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61  * This is so tha
4f00: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63 61  t expressions ca
4f10: 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73 3a  n be written as:
4f20: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f  .**.**   if( isO
4f30: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
4f40: 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e   ){ ....**.** in
4f50: 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20  stead of.**.**  
4f60: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66 64   if( pPager->jfd
4f70: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e  ->pMethods ){ ..
4f80: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f  ..*/.#define isO
4f90: 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29 2d  pen(pFd) ((pFd)-
4fa0: 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a 2a  >pMethods)../*.*
4fb0: 2a 20 49 66 20 66 69 6c 65 20 70 46 64 20 69 73  * If file pFd is
4fc0: 20 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69   open, call sqli
4fd0: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e  te3OsUnlock() on
4fe0: 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   it..*/.static i
4ff0: 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69  nt osUnlock(sqli
5000: 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69  te3_file *pFd, i
5010: 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28  nt eLock){.  if(
5020: 20 21 69 73 4f 70 65 6e 28 70 46 64 29 20 29 7b   !isOpen(pFd) ){
5030: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5040: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  TE_OK;.  }.  ret
5050: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  urn sqlite3OsUnl
5060: 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b  ock(pFd, eLock);
5070: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
5080: 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e  unction determin
5090: 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  es whether or no
50a0: 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  t the atomic-wri
50b0: 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  te optimization.
50c0: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  ** can be used w
50d0: 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20  ith this pager. 
50e0: 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  The optimization
50f0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a   can be used if:
5100: 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20  .**.**  (a) the 
5110: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
5120: 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  y OsDeviceCharac
5130: 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69  teristics() indi
5140: 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20  cates that.**   
5150: 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61     a database pa
5160: 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  ge may be writte
5170: 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e  n atomically, an
5180: 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61  d.**  (b) the va
5190: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
51a0: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69  OsSectorSize() i
51b0: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
51c0: 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20  qual.**      to 
51d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
51e0: 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a  *.** The optimiz
51f0: 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c  ation is also al
5200: 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72  ways enabled for
5210: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
5220: 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72  . It is.** an er
5230: 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  ror to call this
5240: 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61   function if pPa
5250: 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  ger is opened on
5260: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a   an in-memory.**
5270: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
5280: 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
5290: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75  tion cannot be u
52a0: 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e  sed, 0 is return
52b0: 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65  ed. If it can be
52c0: 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74   used,.** then t
52d0: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
52e0: 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  d is the size of
52f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5300: 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e  e when it.** con
5310: 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64  tains rollback d
5320: 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20  ata for exactly 
5330: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  one page..*/.#if
5340: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
5350: 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73  E_ATOMIC_WRITE.s
5360: 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75  tatic int jrnlBu
5370: 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a  fferSize(Pager *
5380: 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
5390: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69  t( !MEMDB );.  i
53a0: 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
53b0: 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  File ){.    int 
53c0: 64 63 3b 20 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 2f 2a                /*
53e0: 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65   Device characte
53f0: 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69  ristics */.    i
5400: 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20  nt nSector;     
5410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5420: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
5430: 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67  */.    int szPag
5440: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
5450: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
5460: 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73   size */..    as
5470: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
5480: 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20  ger->fd) );.    
5490: 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  dc = sqlite3OsDe
54a0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
54b0: 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
54c0: 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70  .    nSector = p
54d0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
54e0: 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20  e;.    szPage = 
54f0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
5500: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53 51  ;..    assert(SQ
5510: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
5520: 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b  C512==(512>>8));
5530: 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49  .    assert(SQLI
5540: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
5550: 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
5560: 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26  .    if( 0==(dc&
5570: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
5580: 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29  OMIC|(szPage>>8)
5590: 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50  ) || nSector>szP
55a0: 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65  age) ){.      re
55b0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
55c0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52  }..  return JOUR
55d0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
55e0: 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  r) + JOURNAL_PG_
55f0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65  SZ(pPager);.}.#e
5600: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53  ndif../*.** If S
5610: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
5620: 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65  S is defined the
5630: 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e  n we do some san
5640: 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20  ity checking.** 
5650: 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69  on the cache usi
5660: 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69  ng a hash functi
5670: 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  on.  This is use
5680: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a  d for testing.**
5690: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
56a0: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nly..*/.#ifdef S
56b0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
56c0: 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  S./*.** Return a
56d0: 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20   32-bit hash of 
56e0: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f  the page data fo
56f0: 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  r pPage..*/.stat
5700: 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74  ic u32 pager_dat
5710: 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c  ahash(int nByte,
5720: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
5730: 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61  pData){.  u32 ha
5740: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
5750: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42  .  for(i=0; i<nB
5760: 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68  yte; i++){.    h
5770: 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39  ash = (hash*1039
5780: 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20  ) + pData[i];.  
5790: 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b  }.  return hash;
57a0: 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  .}.static u32 pa
57b0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48  ger_pagehash(PgH
57c0: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  dr *pPage){.  re
57d0: 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68  turn pager_datah
57e0: 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65  ash(pPage->pPage
57f0: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e  r->pageSize, (un
5800: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50  signed char *)pP
5810: 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73  age->pData);.}.s
5820: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
5830: 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67  _set_pagehash(Pg
5840: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70  Hdr *pPage){.  p
5850: 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d  Page->pageHash =
5860: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
5870: 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage);.}../*.**
5880: 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20   The CHECK_PAGE 
5890: 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67  macro takes a Pg
58a0: 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  Hdr* as an argum
58b0: 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43  ent. If SQLITE_C
58c0: 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73  HECK_PAGES.** is
58d0: 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44   defined, and ND
58e0: 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69  EBUG is not defi
58f0: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
5900: 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b   statement check
5910: 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  s.** that the pa
5920: 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72  ge is either dir
5930: 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63  ty or still matc
5940: 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74  hes the calculat
5950: 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f  ed page-hash..*/
5960: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
5970: 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65  AGE(x) checkPage
5980: 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  (x).static void 
5990: 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20  checkPage(PgHdr 
59a0: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
59b0: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
59c0: 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
59d0: 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c  !pPg->pageHash |
59e0: 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  | pPager->errCod
59f0: 65 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d  e.      || (pPg-
5a00: 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
5a10: 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65  TY) || pPg->page
5a20: 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65  Hash==pager_page
5a30: 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a  hash(pPg) );.}..
5a40: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61  #else.#define pa
5a50: 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59  ger_datahash(X,Y
5a60: 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67  )  0.#define pag
5a70: 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20 20  er_pagehash(X)  
5a80: 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  0.#define CHECK_
5a90: 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20  PAGE(x).#endif  
5aa0: 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  /* SQLITE_CHECK_
5ab0: 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  PAGES */../*.** 
5ac0: 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
5ad0: 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  led the journal 
5ae0: 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
5af0: 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70  Pager must be op
5b00: 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  en..** This func
5b10: 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
5b20: 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a   read a master j
5b30: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
5b40: 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e   from the .** en
5b50: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e  d of the file an
5b60: 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  d, if successful
5b70: 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f  , copies it into
5b80: 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64   memory supplied
5b90: 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c   .** by the call
5ba0: 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  er. See comments
5bb0: 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74   above writeMast
5bc0: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
5bd0: 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73  the format.** us
5be0: 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61  ed to store a ma
5bf0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
5c00: 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e  e name at the en
5c10: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  d of a journal f
5c20: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74  ile..**.** zMast
5c30: 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  er must point to
5c40: 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
5c50: 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79  least nMaster by
5c60: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  tes allocated by
5c70: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20  .** the caller. 
5c80: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73  This should be s
5c90: 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
5ca0: 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75  hname+1 (to ensu
5cb0: 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65  re there is.** e
5cc0: 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77  nough space to w
5cd0: 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
5ce0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49  journal name). I
5cf0: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
5d00: 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20  rnal.** name in 
5d10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  the journal is l
5d20: 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74  onger than nMast
5d30: 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64  er bytes (includ
5d40: 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72  ing a.** nul-ter
5d50: 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74  minator), then t
5d60: 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61  his is handled a
5d70: 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  s if no master j
5d80: 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77  ournal name.** w
5d90: 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74  ere present in t
5da0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
5db0: 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
5dc0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
5dd0: 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74 68  is present at th
5de0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75  e end of the jou
5df0: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68  rnal.** file, th
5e00: 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  en it is copied 
5e10: 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
5e20: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
5e30: 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d  aster. A.** nul-
5e40: 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
5e50: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
5e60: 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77  he buffer follow
5e70: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a  ing the master.*
5e80: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
5e90: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  ame..**.** If it
5ea0: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74   is determined t
5eb0: 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  hat no master jo
5ec0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
5ed0: 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a  is present .** z
5ee0: 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74  Master[0] is set
5ef0: 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
5f00: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
5f10: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
5f20: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 61  occurs while rea
5f30: 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ding from the jo
5f40: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53  urnal file, an S
5f50: 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63  QLite.** error c
5f60: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
5f70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
5f80: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
5f90: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
5fa0: 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73  Jrnl, char *zMas
5fb0: 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72  ter, u32 nMaster
5fc0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
5fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fe0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
5ff0: 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20  /.  u32 len;    
6000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6010: 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65  * Length in byte
6020: 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
6030: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36  nal name */.  i6
6040: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
6050: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
6060: 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  l size in bytes 
6070: 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
6080: 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63  pJrnl */.  u32 c
6090: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
60a0: 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63        /* MJ chec
60b0: 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20  ksum value read 
60c0: 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  from journal */.
60d0: 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
60f0: 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
6100: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67  unter */.  unsig
6110: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
6120: 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65  8];   /* A buffe
6130: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
6140: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
6150: 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30  zMaster[0] = '\0
6160: 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  ';..  if( SQLITE
6170: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
6180: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72  e3OsFileSize(pJr
6190: 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c  nl, &szJ)).   ||
61a0: 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51   szJ<16.   || SQ
61b0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
61c0: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
61d0: 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a   szJ-16, &len)).
61e0: 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74     || len>=nMast
61f0: 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  er .   || SQLITE
6200: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
6210: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
6220: 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20  -12, &cksum)).  
6230: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
6240: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
6250: 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63  ad(pJrnl, aMagic
6260: 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20  , 8, szJ-8)).   
6270: 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  || memcmp(aMagic
6280: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
6290: 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45   8).   || SQLITE
62a0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
62b0: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
62c0: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a  zMaster, len, sz
62d0: 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a  J-16-len)).  ){.
62e0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
62f0: 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20   }..  /* See if 
6300: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74  the checksum mat
6310: 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20  ches the master 
6320: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
6330: 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e    for(u=0; u<len
6340: 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; u++){.    cksu
6350: 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b  m -= zMaster[u];
6360: 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d  .  }.  if( cksum
6370: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
6380: 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e  e checksum doesn
6390: 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20  't add up, then 
63a0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
63b0: 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a  he disk sectors.
63c0: 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e      ** containin
63d0: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
63e0: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73  rnal filename is
63f0: 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73   corrupted. This
6400: 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65   means.    ** de
6410: 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61  finitely roll ba
6420: 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75  ck, so just retu
6430: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  rn SQLITE_OK and
6440: 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a   report a (nul).
6450: 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f      ** master-jo
6460: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a  urnal filename..
6470: 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d      */.    len =
6480: 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65   0;.  }.  zMaste
6490: 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20  r[len] = '\0';. 
64a0: 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
64b0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
64c0: 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65  Return the offse
64d0: 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  t of the sector 
64e0: 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69  boundary at or i
64f0: 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66  mmediately .** f
6500: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c  ollowing the val
6510: 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f  ue in pPager->jo
6520: 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69  urnalOff, assumi
6530: 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20  ng a sector .** 
6540: 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  size of pPager->
6550: 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73  sectorSize bytes
6560: 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20  ..**.** i.e for 
6570: 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66  a sector size of
6580: 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61   512:.**.**   Pa
6590: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20  ger.journalOff  
65a0: 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 76          Return v
65b0: 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  alue.**   ------
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 0a 2a 2a 20 20 20 30 20 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 30 0a 2a 2a 20 20 20 35 31 32 20 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 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 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 35 31 32 0a 2a 2a 20 20 20 32 30       512.**   20
6650: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
6660: 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20          2048.** 
6670: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a  .*/.static i64 j
6680: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
6690: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
66a0: 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
66b0: 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67  ;.  i64 c = pPag
66c0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
66d0: 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f    if( c ){.    o
66e0: 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a  ffset = ((c-1)/J
66f0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
6700: 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55  ager) + 1) * JOU
6710: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
6720: 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  er);.  }.  asser
6730: 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41  t( offset%JOURNA
6740: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
6750: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
6760: 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20   offset>=c );.  
6770: 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d  assert( (offset-
6780: 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  c)<JOURNAL_HDR_S
6790: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  Z(pPager) );.  r
67a0: 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a  eturn offset;.}.
67b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
67c0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
67d0: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66  open when this f
67e0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
67f0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
6800: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
6810: 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  p if the journal
6820: 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65   file has not be
6830: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a  en written to.**
6840: 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72   within the curr
6850: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
6860: 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a  (i.e. if Pager.j
6870: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a  ournalOff==0)..*
6880: 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61  *.** If doTrunca
6890: 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  te is non-zero o
68a0: 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72  r the Pager.jour
68b0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72  nalSizeLimit var
68c0: 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20  iable is.** set 
68d0: 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63  to 0, then trunc
68e0: 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
68f0: 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74  file to zero byt
6900: 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65  es in size. Othe
6910: 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74  rwise,.** zero t
6920: 68 65 20 32 38 2d 62 79 74 65 20 68 65 61 64 65  he 28-byte heade
6930: 72 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  r at the start o
6940: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
6950: 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  le. In either ca
6960: 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70  se, .** if the p
6970: 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e  ager is not in n
6980: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e  o-sync mode, syn
6990: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
69a0: 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a  le immediately .
69b0: 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e 67  ** after writing
69c0: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69   or truncating i
69d0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65  t..**.** If Page
69e0: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
69f0: 69 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 70  it is set to a p
6a00: 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72  ositive, non-zer
6a10: 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20  o value, and.** 
6a20: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72  following the tr
6a30: 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f  uncation or zero
6a40: 69 6e 67 20 64 65 73 63 72 69 62 65 64 20 61 62  ing described ab
6a50: 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ove the size of 
6a60: 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  the .** journal 
6a70: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73  file in bytes is
6a80: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
6a90: 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72  s value, then tr
6aa0: 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f  uncate the.** jo
6ab0: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61  urnal file to Pa
6ac0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
6ad0: 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65 20  imit bytes. The 
6ae0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
6af0: 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f  s.** not need to
6b00: 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f   be synced follo
6b10: 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74  wing this operat
6b20: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ion..**.** If an
6b30: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
6b40: 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73  , abandon proces
6b50: 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20  sing and return 
6b60: 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
6b70: 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  e..** Otherwise,
6b80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6b90: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
6ba0: 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
6bb0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
6bc0: 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a  nt doTruncate){.
6bd0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
6be0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c00: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
6c10: 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  de */.  assert( 
6c20: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
6c30: 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  fd) );.  if( pPa
6c40: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
6c50: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34  ){.    const i64
6c60: 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72   iLimit = pPager
6c70: 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  ->journalSizeLim
6c80: 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  it;    /* Local 
6c90: 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a  cache of jsl */.
6ca0: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
6cb0: 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70  ZEROHDR %p\n", p
6cc0: 50 61 67 65 72 29 29 0a 20 20 20 20 69 66 28 20  Pager)).    if( 
6cd0: 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c  doTruncate || iL
6ce0: 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  imit==0 ){.     
6cf0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
6d00: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
6d10: 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  jfd, 0);.    }el
6d20: 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63  se{.      static
6d30: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f   const char zero
6d40: 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20  Hdr[28] = {0};. 
6d50: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6d60: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
6d70: 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73  >jfd, zeroHdr, s
6d80: 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20  izeof(zeroHdr), 
6d90: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
6da0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6db0: 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
6dc0: 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nc ){.      rc =
6dd0: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
6de0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49  Pager->jfd, SQLI
6df0: 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
6e00: 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c  |pPager->sync_fl
6e10: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ags);.    }..   
6e20: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
6e30: 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
6e40: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62  n is committed b
6e50: 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ut the write loc
6e60: 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69  k .    ** is sti
6e70: 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66  ll held on the f
6e80: 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
6e90: 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f   a size limit co
6ea0: 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20  nfigured for .  
6eb0: 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74    ** the persist
6ec0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ent journal and 
6ed0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6ee0: 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75   currently consu
6ef0: 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20  mes more.    ** 
6f00: 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74 20  space than that 
6f10: 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72  limit allows for
6f20: 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f  , truncate it no
6f30: 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  w. There is no n
6f40: 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79  eed.    ** to sy
6f50: 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c  nc the file foll
6f60: 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61  owing this opera
6f70: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
6f80: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6f90: 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29  OK && iLimit>0 )
6fa0: 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a  {.      i64 sz;.
6fb0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6fc0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
6fd0: 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a  ger->jfd, &sz);.
6fe0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
6ff0: 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c  LITE_OK && sz>iL
7000: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
7010: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
7020: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
7030: 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  fd, iLimit);.   
7040: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
7050: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7060: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
7070: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
7080: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  en when this rou
7090: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
70a0: 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61  A journal.** hea
70b0: 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  der (JOURNAL_HDR
70c0: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72  _SZ bytes) is wr
70d0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
70e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74  ournal file at t
70f0: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f  he.** current lo
7100: 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  cation..**.** Th
7110: 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65  e format for the
7120: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
7130: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
7140: 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67  * - 8 bytes: Mag
7150: 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a  ic identifying j
7160: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a  ournal format..*
7170: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d  * - 4 bytes: Num
7180: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
7190: 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31  n journal, or -1
71a0: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73   no-sync mode is
71b0: 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65   on..** - 4 byte
71c0: 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  s: Random number
71d0: 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68   used for page h
71e0: 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  ash..** - 4 byte
71f0: 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62  s: Initial datab
7200: 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  ase page count..
7210: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65  ** - 4 bytes: Se
7220: 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62  ctor size used b
7230: 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  y the process th
7240: 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f  at wrote this jo
7250: 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79  urnal..** - 4 by
7260: 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70 61  tes: Database pa
7270: 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20  ge size..** .** 
7280: 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55  Followed by (JOU
7290: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
72a0: 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65  ) bytes of unuse
72b0: 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  d space..*/.stat
72c0: 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72  ic int writeJour
72d0: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
72e0: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
72f0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
7300: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7310: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
7320: 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d   char *zHeader =
7330: 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
7340: 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72  ce;  /* Temporar
7350: 79 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20  y space used to 
7360: 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a  build header */.
7370: 20 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20    u32 nHeader = 
7380: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
7390: 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
73a0: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
73b0: 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a 2f  to by zHeader */
73c0: 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20 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 2f 2a 20 42 79 74 65 73 20         /* Bytes 
73f0: 6f 66 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  of header sector
7400: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e   written */.  in
7410: 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
7420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7430: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
7440: 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
7450: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
7460: 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a  fd) );      /* J
7470: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
7480: 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20   be open. */..  
7490: 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52  if( nHeader>JOUR
74a0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
74b0: 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  r) ){.    nHeade
74c0: 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  r = JOURNAL_HDR_
74d0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
74e0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
74f0: 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  re active savepo
7500: 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66 20  ints and any of 
7510: 74 68 65 6d 20 77 65 72 65 20 63 72 65 61 74 65  them were create
7520: 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68  d .  ** since th
7530: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f  e most recent jo
7540: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61 73  urnal header was
7550: 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65   written, update
7560: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
7570: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
7580: 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e  fset fields now.
7590: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  .  */.  for(ii=0
75a0: 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
75b0: 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
75c0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
75d0: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
75e0: 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a  HdrOffset==0 ){.
75f0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53        pPager->aS
7600: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64  avepoint[ii].iHd
7610: 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72  rOffset = pPager
7620: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
7630: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
7640: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
7650: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
7660: 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
7670: 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a  ffset(pPager);..
7680: 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65    /* .  ** Write
7690: 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20   the nRec Field 
76a0: 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  - the number of 
76b0: 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68 61  page records tha
76c0: 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20  t follow this.  
76d0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
76e0: 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72  r. Normally, zer
76f0: 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  o is written to 
7700: 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74 68  this value at th
7710: 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66  is time..  ** Af
7720: 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73 20  ter the records 
7730: 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65  are added to the
7740: 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68   journal (and th
7750: 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64  e journal synced
7760: 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75  , .  ** if in fu
7770: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74  ll-sync mode), t
7780: 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77  he zero is overw
7790: 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65 20  ritten with the 
77a0: 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  true number.  **
77b0: 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65 65   of records (see
77c0: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e   syncJournal()).
77d0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73  .  **.  ** A fas
77e0: 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20  ter alternative 
77f0: 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46 46  is to write 0xFF
7800: 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52  FFFFFF to the nR
7810: 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20  ec field. When. 
7820: 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
7830: 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c  journal this val
7840: 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20  ue tells SQLite 
7850: 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  to assume that t
7860: 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20  he.  ** rest of 
7870: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
7880: 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20   contains valid 
7890: 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68  page records. Th
78a0: 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20  is assumption.  
78b0: 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c  ** is dangerous,
78c0: 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72 65   as if a failure
78d0: 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73 74   occurred whilst
78e0: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
78f0: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
7900: 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e  e it may contain
7910: 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61   some garbage da
7920: 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  ta. There are tw
7930: 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a  o scenarios.  **
7940: 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73 6b   where this risk
7950: 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a   can be ignored:
7960: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57  .  **.  **   * W
7970: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
7980: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
7990: 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e  . Corruption can
79a0: 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20   follow a.  **  
79b0: 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65     power failure
79c0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e   in this case an
79d0: 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  yway..  **.  ** 
79e0: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c    * When the SQL
79f0: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
7a00: 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65  PPEND flag is se
7a10: 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65  t. This guarante
7a20: 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74  es.  **     that
7a30: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69 73   garbage data is
7a40: 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64 20   never appended 
7a50: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
7a60: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
7a70: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
7a80: 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
7a90: 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66  ->noSync );.  if
7aa0: 28 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( (pPager->noSyn
7ab0: 63 29 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a  c) || (pPager->j
7ac0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
7ad0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
7ae0: 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c  MORY).   || (sql
7af0: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
7b00: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
7b10: 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
7b20: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
7b30: 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63  ) .  ){.    memc
7b40: 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75  py(zHeader, aJou
7b50: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
7b60: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
7b70: 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73  );.    put32bits
7b80: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
7b90: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
7ba0: 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  , 0xffffffff);. 
7bb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73   }else{.    mems
7bc0: 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20 73  et(zHeader, 0, s
7bd0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7be0: 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20  gic)+4);.  }..  
7bf0: 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68  /* The random ch
7c00: 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c  eck-hash initial
7c10: 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74  iser */ .  sqlit
7c20: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
7c30: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73  zeof(pPager->cks
7c40: 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72  umInit), &pPager
7c50: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
7c60: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
7c70: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
7c80: 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61  alMagic)+4], pPa
7c90: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
7ca0: 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61  .  /* The initia
7cb0: 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
7cc0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
7cd0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
7ce0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d  JournalMagic)+8]
7cf0: 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  , pPager->dbOrig
7d00: 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Size);.  /* The 
7d10: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  assumed sector s
7d20: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  ize for this pro
7d30: 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62  cess */.  put32b
7d40: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
7d50: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
7d60: 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e  c)+12], pPager->
7d70: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20  sectorSize);..  
7d80: 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  /* The page size
7d90: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
7da0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
7db0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
7dc0: 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  6], pPager->page
7dd0: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69  Size);..  /* Ini
7de0: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61  tializing the ta
7df0: 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  il of the buffer
7e00: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
7e10: 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20  y.  Everything. 
7e20: 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69   ** works find i
7e30: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
7e40: 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74  memset() is omit
7e50: 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61  ted.  But initia
7e60: 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  lizing.  ** the 
7e70: 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20  memory prevents 
7e80: 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f  valgrind from co
7e90: 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65  mplaining, so we
7ea0: 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a   are willing to.
7eb0: 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65    ** take the pe
7ec0: 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20  rformance hit.. 
7ed0: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48   */.  memset(&zH
7ee0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
7ef0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c  urnalMagic)+20],
7f00: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65   0,.         nHe
7f10: 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f  ader-(sizeof(aJo
7f20: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29  urnalMagic)+20))
7f30: 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72  ;..  /* In theor
7f40: 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65  y, it is only ne
7f50: 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
7f60: 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74 68   the 28 bytes th
7f70: 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75  at the .  ** jou
7f80: 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73  rnal header cons
7f90: 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72  umes to the jour
7fa0: 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54  nal file here. T
7fb0: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  hen increment th
7fc0: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f  e .  ** Pager.jo
7fd0: 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c  urnalOff variabl
7fe0: 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  e by JOURNAL_HDR
7ff0: 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20  _SZ so that the 
8000: 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72  next .  ** recor
8010: 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  d is written to 
8020: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  the following se
8030: 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20  ctor (leaving a 
8040: 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a  gap in the file.
8050: 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62    ** that will b
8060: 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c  e implicitly fil
8070: 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53  led in by the OS
8080: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77  )..  **.  ** How
8090: 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65 6e  ever it has been
80a0: 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
80b0: 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   on some systems
80c0: 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63 61   this pattern ca
80d0: 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69  n .  ** be signi
80e0: 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20  ficantly slower 
80f0: 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c  than contiguousl
8100: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
8110: 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a  o the file,.  **
8120: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65   even if that me
8130: 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77  ans explicitly w
8140: 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74  riting data to t
8150: 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a  he block of .  *
8160: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
8170: 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74 68  Z - 28) bytes th
8180: 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  at will not be u
8190: 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20  sed. So that is 
81a0: 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e  what.  ** is don
81b0: 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e. .  **.  ** Th
81c0: 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72  e loop is requir
81d0: 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65 20  ed here in case 
81e0: 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  the sector-size 
81f0: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
8200: 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  he .  ** databas
8210: 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e  e page size. Sin
8220: 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20 62  ce the zHeader b
8230: 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61  uffer is only Pa
8240: 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a  ger.pageSize.  *
8250: 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  * bytes in size,
8260: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
8270: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  all to sqlite3Os
8280: 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20 72  Write() may be r
8290: 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20  equired.  ** to 
82a0: 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74  populate the ent
82b0: 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ire journal head
82c0: 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20  er sector..  */ 
82d0: 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b  .  for(nWrite=0;
82e0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26   rc==SQLITE_OK&&
82f0: 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48  nWrite<JOURNAL_H
8300: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e  DR_SZ(pPager); n
8310: 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b  Write+=nHeader){
8320: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
8330: 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e  HDR %p %lld %d\n
8340: 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
8350: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e  r->journalHdr, n
8360: 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63 20  Header)).    rc 
8370: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
8380: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48  (pPager->jfd, zH
8390: 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20  eader, nHeader, 
83a0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
83b0: 66 66 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ff);.    pPager-
83c0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e  >journalOff += n
83d0: 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72  Header;.  }..  r
83e0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
83f0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
8400: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
8410: 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   when this is ca
8420: 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20  lled. A journal 
8430: 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28  header file.** (
8440: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
8450: 79 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72  ytes) is read fr
8460: 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  om the current l
8470: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
8480: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20  ournal.** file. 
8490: 54 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  The current loca
84a0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72  tion in the jour
84b0: 6e 61 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65  nal file is give
84c0: 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e  n by.** pPager->
84d0: 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20  journalOff. See 
84e0: 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66  comments above f
84f0: 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75  unction writeJou
8500: 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a  rnalHdr() for.**
8510: 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   a description o
8520: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
8530: 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a  ader format..**.
8540: 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72  ** If the header
8550: 20 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73   is read success
8560: 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73  fully, *pNRec is
8570: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
8580: 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65  er of.** page re
8590: 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  cords following 
85a0: 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20  this header and 
85b0: 2a 70 44 62 53 69 7a 65 20 69 73 20 73 65 74 20  *pDbSize is set 
85c0: 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
85d0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62  he.** database b
85e0: 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
85f0: 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20  ction began, in 
8600: 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61  pages. Also, pPa
8610: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a  ger->cksumInit.*
8620: 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
8630: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
8640: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
8650: 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  er. SQLITE_OK is
8660: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20   returned.** in 
8670: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
8680: 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
8690: 68 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65  header file appe
86a0: 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70  ars to be corrup
86b0: 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ted, SQLITE_DONE
86c0: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
86d0: 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a  and *pNRec and *
86e0: 50 44 62 53 69 7a 65 20 61 72 65 20 75 6e 64 65  PDbSize are unde
86f0: 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e  fined.  If JOURN
8700: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a  AL_HDR_SZ bytes.
8710: 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61  ** cannot be rea
8720: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
8730: 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72  al file an error
8740: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
8750: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
8760: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
8770: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
8780: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8790: 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
87a0: 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a  */.  int isHot,.
87b0: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a    i64 journalSiz
87c0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
87d0: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 70  * Size of the op
87e0: 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  en journal file 
87f0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
8800: 32 20 2a 70 4e 52 65 63 2c 20 20 20 20 20 20 20  2 *pNRec,       
8810: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
8820: 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20 66 72  T: Value read fr
8830: 6f 6d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  om the nRec fiel
8840: 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44 62 53  d */.  u32 *pDbS
8850: 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
8860: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75      /* OUT: Valu
8870: 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64 61  e of original da
8880: 74 61 62 61 73 65 20 73 69 7a 65 20 66 69 65 6c  tabase size fiel
8890: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  d */.){.  int rc
88a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
88b0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
88c0: 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67   code */.  unsig
88d0: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
88e0: 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62 75 66  8];     /* A buf
88f0: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
8900: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
8910: 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
8920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8930: 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f 75 72  * Offset of jour
8940: 6e 61 6c 20 68 65 61 64 65 72 20 62 65 69 6e 67  nal header being
8950: 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65   read */..  asse
8960: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
8970: 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20  r->jfd) );      
8980: 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  /* Journal file 
8990: 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f  must be open. */
89a0: 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 50  ..  /* Advance P
89b0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
89c0: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
89d0: 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 2e  the next sector.
89e0: 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75   If the.  ** jou
89f0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f  rnal file is too
8a00: 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65 72 65   small for there
8a10: 20 74 6f 20 62 65 20 61 20 68 65 61 64 65 72 20   to be a header 
8a20: 73 74 6f 72 65 64 20 61 74 20 74 68 69 73 0a 20  stored at this. 
8a30: 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74 75 72   ** point, retur
8a40: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20  n SQLITE_DONE.. 
8a50: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   */.  pPager->jo
8a60: 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e  urnalOff = journ
8a70: 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67  alHdrOffset(pPag
8a80: 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
8a90: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f  r->journalOff+JO
8aa0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
8ab0: 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69  ger) > journalSi
8ac0: 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
8ad0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
8ae0: 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50  }.  iHdrOff = pP
8af0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
8b00: 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20  ;..  /* Read in 
8b10: 74 68 65 20 66 69 72 73 74 20 38 20 62 79 74 65  the first 8 byte
8b20: 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
8b30: 20 68 65 61 64 65 72 2e 20 49 66 20 74 68 65 79   header. If they
8b40: 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20   do not match.  
8b50: 2a 2a 20 74 68 65 20 20 6d 61 67 69 63 20 73 74  ** the  magic st
8b60: 72 69 6e 67 20 66 6f 75 6e 64 20 61 74 20 74 68  ring found at th
8b70: 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20  e start of each 
8b80: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20  journal header, 
8b90: 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49  return.  ** SQLI
8ba0: 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49  TE_DONE. If an I
8bb0: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
8bc0: 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
8bd0: 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  code. Otherwise,
8be0: 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20  .  ** proceed.. 
8bf0: 20 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f 74 20   */.  if( isHot 
8c00: 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70 50 61 67  || iHdrOff!=pPag
8c10: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29  er->journalHdr )
8c20: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
8c30: 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
8c40: 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69  >jfd, aMagic, si
8c50: 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 69 48  zeof(aMagic), iH
8c60: 64 72 4f 66 66 29 3b 0a 20 20 20 20 69 66 28 20  drOff);.    if( 
8c70: 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
8c80: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
8c90: 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67   if( memcmp(aMag
8ca0: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
8cb0: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
8cc0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ))!=0 ){.      r
8cd0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
8ce0: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
8cf0: 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73  /* Read the firs
8d00: 74 20 74 68 72 65 65 20 33 32 2d 62 69 74 20 66  t three 32-bit f
8d10: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6a 6f 75  ields of the jou
8d20: 72 6e 61 6c 20 68 65 61 64 65 72 3a 20 54 68 65  rnal header: The
8d30: 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64   nRec.  ** field
8d40: 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 2d 69  , the checksum-i
8d50: 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e 64 20 74  nitializer and t
8d60: 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
8d70: 20 61 74 20 74 68 65 20 73 74 61 72 74 0a 20 20   at the start.  
8d80: 2a 2a 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  ** of the transa
8d90: 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e  ction. Return an
8da0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
8db0: 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  nything goes wro
8dc0: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53  ng..  */.  if( S
8dd0: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
8de0: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
8df0: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
8e00: 38 2c 20 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c  8, pNRec)).   ||
8e10: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
8e20: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
8e30: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
8e40: 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d 3e 63  f+12, &pPager->c
8e50: 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c  ksumInit)).   ||
8e60: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
8e70: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
8e80: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
8e90: 66 2b 31 36 2c 20 70 44 62 53 69 7a 65 29 29 0a  f+16, pDbSize)).
8ea0: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
8eb0: 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rc;.  }..  if( p
8ec0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
8ed0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20  f==0 ){.    u32 
8ee0: 69 50 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20  iPageSize;      
8ef0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
8f00: 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a  -size field of j
8f10: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
8f20: 0a 20 20 20 20 75 33 32 20 69 53 65 63 74 6f 72  .    u32 iSector
8f30: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
8f40: 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65    /* Sector-size
8f50: 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61   field of journa
8f60: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  l header */.    
8f70: 75 31 36 20 69 50 61 67 65 53 69 7a 65 31 36 3b  u16 iPageSize16;
8f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8f90: 43 6f 70 79 20 6f 66 20 69 50 61 67 65 53 69 7a  Copy of iPageSiz
8fa0: 65 20 69 6e 20 31 36 2d 62 69 74 20 76 61 72 69  e in 16-bit vari
8fb0: 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  able */..    /* 
8fc0: 52 65 61 64 20 74 68 65 20 70 61 67 65 2d 73 69  Read the page-si
8fd0: 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69  ze and sector-si
8fe0: 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ze journal heade
8ff0: 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20  r fields. */.   
9000: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
9010: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
9020: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
9030: 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63 74  drOff+20, &iSect
9040: 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c  orSize)).     ||
9050: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
9060: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
9070: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
9080: 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a 65  f+24, &iPageSize
9090: 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
90a0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
90b0: 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
90c0: 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 72  hat the values r
90d0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ead from the pag
90e0: 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f  e-size and secto
90f0: 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a 20 20  r-size fields.  
9100: 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69 6e 20    ** are within 
9110: 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27 69 6e  range. To be 'in
9120: 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20 76 61   range', both va
9130: 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  lues need to be 
9140: 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f  a power.    ** o
9150: 66 20 74 77 6f 20 67 72 65 61 74 65 72 20 74 68  f two greater th
9160: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 35  an or equal to 5
9170: 31 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61  12, and not grea
9180: 74 65 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a  ter than their .
9190: 20 20 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76      ** respectiv
91a0: 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d  e compile time m
91b0: 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20  aximum limits.. 
91c0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50     */.    if( iP
91d0: 61 67 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20  ageSize<512     
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
91f0: 69 53 65 63 74 6f 72 53 69 7a 65 3c 35 31 32 0a  iSectorSize<512.
9200: 20 20 20 20 20 7c 7c 20 69 50 61 67 65 53 69 7a       || iPageSiz
9210: 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
9220: 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f  E_SIZE || iSecto
9230: 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52  rSize>MAX_SECTOR
9240: 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28  _SIZE.     || ((
9250: 69 50 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61  iPageSize-1)&iPa
9260: 67 65 53 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20  geSize)!=0   || 
9270: 28 28 69 53 65 63 74 6f 72 53 69 7a 65 2d 31 29  ((iSectorSize-1)
9280: 26 69 53 65 63 74 6f 72 53 69 7a 65 29 21 3d 30  &iSectorSize)!=0
9290: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f   .    ){.      /
92a0: 2a 20 49 66 20 74 68 65 20 65 69 74 68 65 72 20  * If the either 
92b0: 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 72  the page-size or
92c0: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20   sector-size in 
92d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  the journal-head
92e0: 65 72 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  er is .      ** 
92f0: 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20 74 68  invalid, then th
9300: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77  e process that w
9310: 72 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  rote the journal
9320: 2d 68 65 61 64 65 72 20 6d 75 73 74 20 68 61 76  -header must hav
9330: 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 72 61 73  e .      ** cras
9340: 68 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 68  hed before the h
9350: 65 61 64 65 72 20 77 61 73 20 73 79 6e 63 65 64  eader was synced
9360: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 73  . In this case s
9370: 74 6f 70 20 72 65 61 64 69 6e 67 20 0a 20 20 20  top reading .   
9380: 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
9390: 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20  l file here..   
93a0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75     */.      retu
93b0: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
93c0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70      }..    /* Up
93d0: 64 61 74 65 20 74 68 65 20 70 61 67 65 2d 73 69  date the page-si
93e0: 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
93f0: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
9400: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20  the journal. .  
9410: 20 20 2a 2a 20 55 73 65 20 61 20 74 65 73 74 63    ** Use a testc
9420: 61 73 65 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d  ase() macro to m
9430: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 6d 61  ake sure that ma
9440: 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 77 69 74  lloc failure wit
9450: 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61 67 65  hin .    ** Page
9460: 72 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 69  rSetPagesize() i
9470: 73 20 74 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f  s tested..    */
9480: 0a 20 20 20 20 69 50 61 67 65 53 69 7a 65 31 36  .    iPageSize16
9490: 20 3d 20 28 75 31 36 29 69 50 61 67 65 53 69 7a   = (u16)iPageSiz
94a0: 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
94b0: 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
94c0: 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69 50 61  ize(pPager, &iPa
94d0: 67 65 53 69 7a 65 31 36 2c 20 2d 31 29 3b 0a 20  geSize16, -1);. 
94e0: 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
94f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
9500: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
9510: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 50 61 67 65  LITE_OK || iPage
9520: 53 69 7a 65 31 36 3d 3d 28 75 31 36 29 69 50 61  Size16==(u16)iPa
9530: 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f  geSize );..    /
9540: 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73  * Update the ass
9550: 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65  umed sector-size
9560: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61   to match the va
9570: 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 20  lue used by .   
9580: 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20   ** the process 
9590: 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69  that created thi
95a0: 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68  s journal. If th
95b0: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  is journal was. 
95c0: 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79     ** created by
95d0: 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72   a process other
95e0: 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20   than this one, 
95f0: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
9600: 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 65 69 6e  e.    ** is bein
9610: 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69  g called from wi
9620: 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62  thin pager_playb
9630: 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c  ack(). The local
9640: 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66   value.    ** of
9650: 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
9660: 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 61 74  e is restored at
9670: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74   the end of that
9680: 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f   routine..    */
9690: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
96a0: 74 6f 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f  torSize = iSecto
96b0: 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50  rSize;.  }..  pP
96c0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
96d0: 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   += JOURNAL_HDR_
96e0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  SZ(pPager);.  re
96f0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
9700: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70  ** Write the sup
9710: 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75  plied master jou
9720: 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74  rnal name into t
9730: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
9740: 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61  for pager.** pPa
9750: 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65  ger at the curre
9760: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65  nt location. The
9770: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9780: 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65  name must be the
9790: 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77   last.** thing w
97a0: 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72  ritten to a jour
97b0: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65  nal file. If the
97c0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c   pager is in ful
97d0: 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65  l-sync mode, the
97e0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
97f0: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
9800: 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e  dvanced to the n
9810: 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  ext sector bound
9820: 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ary before.** an
9830: 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65  ything is writte
9840: 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73  n. The format is
9850: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79  :.**.**   + 4 by
9860: 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47  tes: PAGER_MJ_PG
9870: 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74  NO..**   + N byt
9880: 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e  es: Master journ
9890: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75  al filename in u
98a0: 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62  tf-8..**   + 4 b
98b0: 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20  ytes: N (length 
98c0: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
98d0: 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 2c  l name in bytes,
98e0: 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74   no nul-terminat
98f0: 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79  or)..**   + 4 by
9900: 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72  tes: Master jour
9910: 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75  nal name checksu
9920: 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74 65  m..**   + 8 byte
9930: 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  s: aJournalMagic
9940: 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  []..**.** The ma
9950: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67  ster journal pag
9960: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68  e checksum is th
9970: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74  e sum of the byt
9980: 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  es in the master
9990: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  .** journal name
99a0: 2c 20 77 68 65 72 65 20 65 61 63 68 20 62 79 74  , where each byt
99b0: 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  e is interpreted
99c0: 20 61 73 20 61 20 73 69 67 6e 65 64 20 38 2d 62   as a signed 8-b
99d0: 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a  it integer..**.*
99e0: 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20  * If zMaster is 
99f0: 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28  a NULL pointer (
9a00: 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e  occurs for a sin
9a10: 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
9a20: 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74  nsaction), .** t
9a30: 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
9a40: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
9a50: 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  nt writeMasterJo
9a60: 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
9a70: 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
9a80: 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
9a90: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
9aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9ab0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
9ac0: 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20    int nMaster;  
9ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ae0: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
9af0: 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a  string zMaster *
9b00: 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
9b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b20: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
9b30: 66 20 68 65 61 64 65 72 20 69 6e 20 6a 6f 75 72  f header in jour
9b40: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
9b50: 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20  4 jrnlSize;     
9b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9b70: 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61  * Size of journa
9b80: 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a  l file on disk *
9b90: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20  /.  u32 cksum = 
9ba0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
9bb0: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
9bc0: 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74   of string zMast
9bd0: 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20 21 7a 4d  er */..  if( !zM
9be0: 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d  aster || pPager-
9bf0: 3e 73 65 74 4d 61 73 74 65 72 0a 20 20 20 7c 7c  >setMaster.   ||
9c00: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9c10: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
9c20: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
9c30: 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
9c40: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
9c50: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
9c60: 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72   .  ){.    retur
9c70: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
9c80: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
9c90: 73 74 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65  ster = 1;.  asse
9ca0: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
9cb0: 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a  r->jfd) );..  /*
9cc0: 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c   Calculate the l
9cd0: 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 61  ength in bytes a
9ce0: 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  nd the checksum 
9cf0: 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20  of zMaster */.  
9d00: 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a  for(nMaster=0; z
9d10: 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b  Master[nMaster];
9d20: 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20   nMaster++){.   
9d30: 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65   cksum += zMaste
9d40: 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a  r[nMaster];.  }.
9d50: 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c  .  /* If in full
9d60: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61  -sync mode, adva
9d70: 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
9d80: 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f  disk sector befo
9d90: 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20  re writing.  ** 
9da0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
9db0: 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73  al name. This is
9dc0: 20 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65   in case the pre
9dd0: 76 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74  vious page writt
9de0: 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a  en to.  ** the j
9df0: 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61  ournal has alrea
9e00: 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a  dy been synced..
9e10: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
9e20: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
9e30: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
9e40: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
9e50: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
9e60: 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20  ;.  }.  iHdrOff 
9e70: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
9e80: 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74  lOff;..  /* Writ
9e90: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
9ea0: 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65  rnal data to the
9eb0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72   end of the jour
9ec0: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a  nal file. If.  *
9ed0: 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * an error occur
9ee0: 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  s, return the er
9ef0: 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
9f00: 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  caller..  */.  i
9f10: 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77  f( (0 != (rc = w
9f20: 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
9f30: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c  r->jfd, iHdrOff,
9f40: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
9f50: 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20  Pager)))).   || 
9f60: 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69  (0 != (rc = sqli
9f70: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
9f80: 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
9f90: 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66   nMaster, iHdrOf
9fa0: 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  f+4))).   || (0 
9fb0: 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
9fc0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
9fd0: 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73  , iHdrOff+4+nMas
9fe0: 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a  ter, nMaster))).
9ff0: 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
a000: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
a010: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
a020: 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20  ff+4+nMaster+4, 
a030: 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28  cksum))).   || (
a040: 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74  0 != (rc = sqlit
a050: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
a060: 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d  ->jfd, aJournalM
a070: 61 67 69 63 2c 20 38 2c 20 69 48 64 72 4f 66 66  agic, 8, iHdrOff
a080: 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a  +4+nMaster+8))).
a090: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
a0a0: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  rc;.  }.  pPager
a0b0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
a0c0: 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a 20 20  (nMaster+20);.  
a0d0: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
a0e0: 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = !pPager->noSy
a0f0: 6e 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  nc;..  /* If the
a100: 20 70 61 67 65 72 20 69 73 20 69 6e 20 70 65 72   pager is in per
a110: 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d  istent-journal m
a120: 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68  ode, then the ph
a130: 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75  ysical .  ** jou
a140: 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78  rnal-file may ex
a150: 74 65 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e  tend past the en
a160: 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d  d of the master-
a170: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a  journal name.  *
a180: 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66  * and 8 bytes of
a190: 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73 74   magic data just
a1a0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
a1b0: 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20  file. This is . 
a1c0: 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65   ** dangerous be
a1d0: 63 61 75 73 65 20 74 68 65 20 63 6f 64 65 20 74  cause the code t
a1e0: 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74  o rollback a hot
a1f0: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20  -journal file.  
a200: 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  ** will not be a
a210: 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ble to find the 
a220: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
a230: 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
a240: 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f   .  ** whether o
a250: 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
a260: 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a  l is hot. .  **.
a270: 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69    ** Easiest thi
a280: 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73  ng to do in this
a290: 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20   scenario is to 
a2a0: 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
a2b0: 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
a2c0: 74 6f 20 74 68 65 20 72 65 71 75 69 72 65 64 20  to the required 
a2d0: 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  size..  */ .  if
a2e0: 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  ( SQLITE_OK==(rc
a2f0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
a300: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
a310: 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20  , &jrnlSize)).  
a320: 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61   && jrnlSize>pPa
a330: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
a340: 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71    ){.    rc = sq
a350: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
a360: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
a370: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
a380: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
a390: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  c;.}../*.** Find
a3a0: 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68   a page in the h
a3b0: 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ash table given 
a3c0: 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  its page number.
a3d0: 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   Return.** a poi
a3e0: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
a3f0: 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   or NULL if the 
a400: 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
a410: 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64  s not .** alread
a420: 79 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  y in memory..*/.
a430: 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
a440: 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
a450: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
a460: 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
a470: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
a490: 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
a4a0: 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
a4b0: 73 69 62 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c  sible for a call
a4c0: 20 74 6f 20 50 63 61 63 68 65 46 65 74 63 68 28   to PcacheFetch(
a4d0: 29 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61  ) with createFla
a4e0: 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69  g==0 to.  ** fai
a4f0: 6c 2c 20 73 69 6e 63 65 20 6e 6f 20 61 74 74 65  l, since no atte
a500: 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  mpt to allocate 
a510: 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77  dynamic memory w
a520: 69 6c 6c 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a  ill be made..  *
a530: 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65  /.  (void)sqlite
a540: 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
a550: 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
a560: 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72 65  no, 0, &p);.  re
a570: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
a580: 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   Unless the page
a590: 72 20 69 73 20 69 6e 20 65 72 72 6f 72 2d 73 74  r is in error-st
a5a0: 61 74 65 2c 20 64 69 73 63 61 72 64 20 61 6c 6c  ate, discard all
a5b0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
a5c0: 2e 20 49 66 0a 2a 2a 20 74 68 65 20 70 61 67 65  . If.** the page
a5d0: 72 20 69 73 20 69 6e 20 65 72 72 6f 72 2d 73 74  r is in error-st
a5e0: 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73 20 63  ate, then this c
a5f0: 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
a600: 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 57 68 79 20  **.** TODO: Why 
a610: 63 61 6e 20 77 65 20 6e 6f 74 20 72 65 73 65 74  can we not reset
a620: 20 74 68 65 20 70 61 67 65 72 20 77 68 69 6c 65   the pager while
a630: 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 3f   in error state?
a640: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a650: 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65  pager_reset(Page
a660: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
a670: 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 70 50 61  ( SQLITE_OK==pPa
a680: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
a690: 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
a6a0: 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d  pRestart(pPager-
a6b0: 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 73  >pBackup);.    s
a6c0: 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
a6d0: 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  r(pPager->pPCach
a6e0: 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  e);.    pPager->
a6f0: 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b  dbSizeValid = 0;
a700: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
a710: 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65  ee all structure
a720: 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61  s in the Pager.a
a730: 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61  Savepoint[] arra
a740: 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a  y and set both.*
a750: 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  * Pager.aSavepoi
a760: 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61  nt and Pager.nSa
a770: 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e  vepoint to zero.
a780: 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a   Close the sub-j
a790: 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20  ournal.** if it 
a7a0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
a7b0: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
a7c0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a  exclusive mode..
a7d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
a7e0: 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
a7f0: 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  nts(Pager *pPage
a800: 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20  r){.  int ii;   
a810: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
a820: 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70  terator for loop
a830: 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67 65  ing through Page
a840: 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  r.aSavepoint */.
a850: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
a860: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
a870: 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71  t; ii++){.    sq
a880: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
a890: 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  oy(pPager->aSave
a8a0: 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76  point[ii].pInSav
a8b0: 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69  epoint);.  }.  i
a8c0: 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
a8d0: 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c  usiveMode || sql
a8e0: 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c  ite3IsMemJournal
a8f0: 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
a900: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
a910: 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66  lose(pPager->sjf
a920: 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
a930: 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61  3_free(pPager->a
a940: 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50  Savepoint);.  pP
a950: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
a960: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
a970: 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  nSavepoint = 0;.
a980: 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
a990: 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c = 0;.}../*.** 
a9a0: 53 65 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62  Set the bit numb
a9b0: 65 72 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50  er pgno in the P
a9c0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
a9d0: 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62  nSavepoint .** b
a9e0: 69 74 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70  itvecs of all op
a9f0: 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52  en savepoints. R
aa00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
aa10: 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a  if successful.**
aa20: 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   or SQLITE_NOMEM
aa30: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
aa40: 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  lure occurs..*/.
aa50: 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f  static int addTo
aa60: 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
aa70: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
aa80: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
aa90: 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
aaa0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
aab0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
aac0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
aad0: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
aae0: 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28   code */..  for(
aaf0: 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d  ii=0; ii<pPager-
ab00: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
ab10: 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76  +){.    PagerSav
ab20: 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61  epoint *p = &pPa
ab30: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
ab40: 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  ii];.    if( pgn
ab50: 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20  o<=p->nOrig ){. 
ab60: 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74       rc |= sqlit
ab70: 65 33 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70  e3BitvecSet(p->p
ab80: 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e  InSavepoint, pgn
ab90: 6f 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  o);.      testca
aba0: 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
abb0: 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73  OMEM );.      as
abc0: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
abd0: 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
abe0: 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d  E_NOMEM );.    }
abf0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
ac00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  ;.}../*.** Unloc
ac10: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
ac20: 69 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ile. This functi
ac30: 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  on is a no-op if
ac40: 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 69 73   the pager.** is
ac50: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
ac60: 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  de..**.** If the
ac70: 20 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e   pager is curren
ac80: 74 6c 79 20 69 6e 20 65 72 72 6f 72 20 73 74 61  tly in error sta
ac90: 74 65 2c 20 64 69 73 63 61 72 64 20 74 68 65 20  te, discard the 
aca0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 0a 2a 2a 20  contents of .** 
acb0: 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 72 65  the cache and re
acc0: 73 65 74 20 74 68 65 20 50 61 67 65 72 20 73 74  set the Pager st
acd0: 72 75 63 74 75 72 65 20 69 6e 74 65 72 6e 61 6c  ructure internal
ace0: 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 72 65   state. If there
acf0: 20 69 73 0a 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a   is.** an open j
ad00: 6f 75 72 6e 61 6c 2d 66 69 6c 65 2c 20 74 68 65  ournal-file, the
ad10: 6e 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  n the next time 
ad20: 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73  a shared-lock is
ad30: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20   obtained.** on 
ad40: 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 28  the pager file (
ad50: 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
ad60: 74 68 65 72 20 70 72 6f 63 65 73 73 29 2c 20 69  ther process), i
ad70: 74 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 74 72 65  t will be.** tre
ad80: 61 74 65 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f  ated as a hot-jo
ad90: 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64  urnal and rolled
ada0: 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   back..*/.static
adb0: 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f   void pager_unlo
adc0: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
add0: 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ){.  if( !pPager
ade0: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
adf0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20  ){.    int rc;  
ae00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae10: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
ae20: 64 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41 6c  de */..    /* Al
ae30: 77 61 79 73 20 63 6c 6f 73 65 20 74 68 65 20 6a  ways close the j
ae40: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
ae50: 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61   dropping the da
ae60: 74 61 62 61 73 65 20 6c 6f 63 6b 2e 0a 20 20 20  tabase lock..   
ae70: 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61   ** Otherwise, a
ae80: 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f  nother connectio
ae90: 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d  n with journal_m
aea0: 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74  ode=delete might
aeb0: 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 65 20 74  .    ** delete t
aec0: 68 65 20 66 69 6c 65 20 6f 75 74 20 66 72 6f 6d  he file out from
aed0: 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a   under us..    *
aee0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  /.    sqlite3OsC
aef0: 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
af00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  );.    sqlite3Bi
af10: 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
af20: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
af30: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
af40: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
af50: 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
af60: 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a  oints(pPager);..
af70: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
af80: 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20  le is unlocked, 
af90: 73 6f 6d 65 62 6f 64 79 20 65 6c 73 65 20 6d 69  somebody else mi
afa0: 67 68 74 20 63 68 61 6e 67 65 20 69 74 2e 20 54  ght change it. T
afb0: 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  he.    ** values
afc0: 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72   stored in Pager
afd0: 2e 64 62 53 69 7a 65 20 65 74 63 2e 20 6d 69 67  .dbSize etc. mig
afe0: 68 74 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69  ht become invali
aff0: 64 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 69 73  d if.    ** this
b000: 20 68 61 70 70 65 6e 73 2e 20 54 4f 44 4f 3a 20   happens. TODO: 
b010: 52 65 61 6c 6c 79 2c 20 74 68 69 73 20 64 6f 65  Really, this doe
b020: 73 6e 27 74 20 6e 65 65 64 20 74 6f 20 62 65 20  sn't need to be 
b030: 63 6c 65 61 72 65 64 0a 20 20 20 20 2a 2a 20 75  cleared.    ** u
b040: 6e 74 69 6c 20 74 68 65 20 63 68 61 6e 67 65 2d  ntil the change-
b050: 63 6f 75 6e 74 65 72 20 63 68 65 63 6b 20 66 61  counter check fa
b060: 69 6c 73 20 69 6e 20 50 61 67 65 72 53 68 61 72  ils in PagerShar
b070: 65 64 4c 6f 63 6b 28 29 2e 0a 20 20 20 20 2a 2f  edLock()..    */
b080: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
b090: 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 0a 20  izeValid = 0;.. 
b0a0: 20 20 20 72 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b     rc = osUnlock
b0b0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  (pPager->fd, NO_
b0c0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  LOCK);.    if( r
b0d0: 63 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  c ){.      pPage
b0e0: 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b  r->errCode = rc;
b0f0: 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41  .    }.    IOTRA
b100: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e  CE(("UNLOCK %p\n
b110: 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20  ", pPager))..   
b120: 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72   /* If Pager.err
b130: 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65  Code is set, the
b140: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
b150: 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e   pager cache can
b160: 6e 6f 74 20 62 65 0a 20 20 20 20 2a 2a 20 74 72  not be.    ** tr
b170: 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20  usted. Now that 
b180: 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 69  the pager file i
b190: 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 20  s unlocked, the 
b1a0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
b1b0: 20 20 20 20 2a 2a 20 63 61 63 68 65 20 63 61 6e      ** cache can
b1c0: 20 62 65 20 64 69 73 63 61 72 64 65 64 20 61 6e   be discarded an
b1d0: 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
b1e0: 20 73 61 66 65 6c 79 20 63 6c 65 61 72 65 64 2e   safely cleared.
b1f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
b200: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
b210: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  ){.      if( rc=
b220: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b230: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
b240: 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f  rCode = SQLITE_O
b250: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
b260: 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
b270: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ger);.    }..   
b280: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
b290: 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
b2a0: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
b2b0: 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
b2c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
b2d0: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
b2e0: 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e  d be called when
b2f0: 20 61 6e 20 49 4f 45 52 52 2c 20 43 4f 52 52 55   an IOERR, CORRU
b300: 50 54 20 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72  PT or FULL error
b310: 0a 2a 2a 20 6d 61 79 20 68 61 76 65 20 6f 63 63  .** may have occ
b320: 75 72 72 65 64 2e 20 54 68 65 20 66 69 72 73 74  urred. The first
b330: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
b340: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
b350: 67 65 72 20 0a 2a 2a 20 73 74 72 75 63 74 75 72  ger .** structur
b360: 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 74 68  e, the second th
b370: 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f  e error-code abo
b380: 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ut to be returne
b390: 64 20 62 79 20 61 20 70 61 67 65 72 20 0a 2a 2a  d by a pager .**
b3a0: 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54   API function. T
b3b0: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
b3c0: 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  d is a copy of t
b3d0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
b3e0: 6e 74 20 0a 2a 2a 20 74 6f 20 74 68 69 73 20 66  nt .** to this f
b3f0: 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  unction. .**.** 
b400: 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
b410: 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45  gument is SQLITE
b420: 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43  _IOERR, SQLITE_C
b430: 4f 52 52 55 50 54 2c 20 6f 72 20 53 51 4c 49 54  ORRUPT, or SQLIT
b440: 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72  E_FULL.** the er
b450: 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73  ror becomes pers
b460: 69 73 74 65 6e 74 2e 20 55 6e 74 69 6c 20 74 68  istent. Until th
b470: 65 20 70 65 72 73 69 73 74 65 6e 20 65 72 72 6f  e persisten erro
b480: 72 20 69 73 20 63 6c 65 61 72 65 64 2c 0a 2a 2a  r is cleared,.**
b490: 20 73 75 62 73 65 71 75 65 6e 74 20 41 50 49 20   subsequent API 
b4a0: 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50 61  calls on this Pa
b4b0: 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61  ger will immedia
b4c0: 74 65 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20  tely return the 
b4d0: 73 61 6d 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63  same .** error c
b4e0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72  ode..**.** A per
b4f0: 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 69 6e  sistent error in
b500: 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
b510: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
b520: 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a   pager-cache .**
b530: 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74   cannot be trust
b540: 65 64 2e 20 54 68 69 73 20 73 74 61 74 65 20 63  ed. This state c
b550: 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62 79  an be cleared by
b560: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63   completely disc
b570: 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63  arding .** the c
b580: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
b590: 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61  ager-cache. If a
b5a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
b5b0: 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20   active when.** 
b5c0: 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65  the persistent e
b5d0: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74  rror occurred, t
b5e0: 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  hen the rollback
b5f0: 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65   journal may nee
b600: 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61  d.** to be repla
b610: 79 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74  yed to restore t
b620: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
b630: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
b640: 20 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65   (as if.** it we
b650: 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  re a hot-journal
b660: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
b670: 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67   pager_error(Pag
b680: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
b690: 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d  rc){.  int rc2 =
b6a0: 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73   rc & 0xff;.  as
b6b0: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
b6c0: 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b  _OK || !MEMDB );
b6d0: 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20  .  assert(.     
b6e0: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
b6f0: 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  e==SQLITE_FULL |
b700: 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  |.       pPager-
b710: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
b720: 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70  _OK ||.       (p
b730: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
b740: 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49   0xff)==SQLITE_I
b750: 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 20  OERR.  );.  if( 
b760: 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  rc2==SQLITE_FULL
b770: 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f   || rc2==SQLITE_
b780: 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50 61  IOERR ){.    pPa
b790: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72  ger->errCode = r
b7a0: 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  c;.  }.  return 
b7b0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65  rc;.}../*.** Exe
b7c0: 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  cute a rollback 
b7d0: 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
b7e0: 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75   is active and u
b7f0: 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61  nlock the .** da
b800: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a  tabase file. .**
b810: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
b820: 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74   has already ent
b830: 65 72 65 64 20 74 68 65 20 65 72 72 6f 72 20 73  ered the error s
b840: 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74  tate, do not att
b850: 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c  empt .** the rol
b860: 6c 62 61 63 6b 20 61 74 20 74 68 69 73 20 74 69  lback at this ti
b870: 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67  me. Instead, pag
b880: 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63  er_unlock() is c
b890: 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61  alled. The.** ca
b8a0: 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
b8b0: 63 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72  ck() will discar
b8c0: 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20  d all in-memory 
b8d0: 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a  pages, unlock.**
b8e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
b8f0: 6c 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65  le and clear the
b900: 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 49 66   error state. If
b910: 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   this means that
b920: 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68  .** there is a h
b930: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20  ot-journal left 
b940: 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
b950: 65 6d 2c 20 74 68 65 20 6e 65 78 74 20 63 6f 6e  em, the next con
b960: 6e 65 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 6f 62  nection.** to ob
b970: 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f  tain a shared lo
b980: 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ck on the pager 
b990: 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 74 68  (which may be th
b9a0: 69 73 20 6f 6e 65 29 20 77 69 6c 6c 0a 2a 2a 20  is one) will.** 
b9b0: 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a  roll it back..**
b9c0: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
b9d0: 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
b9e0: 20 65 6e 74 65 72 65 64 20 74 68 65 20 65 72 72   entered the err
b9f0: 6f 72 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e  or state, but an
ba00: 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63   IO or.** malloc
ba10: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
ba20: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  ring a rollback,
ba30: 20 74 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20   then this will 
ba40: 69 74 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a  itself cause .**
ba50: 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e   the pager to en
ba60: 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ter the error st
ba70: 61 74 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20  ate. Which will 
ba80: 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 74 68  be cleared by th
ba90: 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67  e.** call to pag
baa0: 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20  er_unlock(), as 
bab0: 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e  described above.
bac0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
bad0: 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
bae0: 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
baf0: 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
bb00: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
bb10: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
bb20: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
bb30: 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
bb40: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
bb50: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
bb60: 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
bb70: 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
bb80: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
bb90: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a  gnMalloc();.  }.
bba0: 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
bbb0: 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
bbc0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
bbd0: 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ds a transaction
bbe0: 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  . A transaction 
bbf0: 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64  is usually ended
bc00: 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61   by .** either a
bc10: 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c   COMMIT or a ROL
bc20: 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e  LBACK operation.
bc30: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
bc40: 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20  y be called .** 
bc50: 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  after rollback o
bc60: 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  f a hot-journal,
bc70: 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
bc80: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65  occurs while ope
bc90: 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  ning.** the jour
bca0: 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74  nal file or writ
bcb0: 69 6e 67 20 74 68 65 20 76 65 72 79 20 66 69 72  ing the very fir
bcc0: 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  st journal-heade
bcd0: 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61  r of a.** databa
bce0: 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  se transaction..
bcf0: 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  ** .** If the pa
bd00: 67 65 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f  ger is in PAGER_
bd10: 53 48 41 52 45 44 20 6f 72 20 50 41 47 45 52 5f  SHARED or PAGER_
bd20: 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 77 68 65  UNLOCK state whe
bd30: 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  n this.** routin
bd40: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  e is called, it 
bd50: 69 73 20 61 20 6e 6f 2d 6f 70 20 28 72 65 74 75  is a no-op (retu
bd60: 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a  rns SQLITE_OK)..
bd70: 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
bd80: 20 61 6e 79 20 61 63 74 69 76 65 20 73 61 76 65   any active save
bd90: 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65 61  points are relea
bda0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
bdb0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
bdc0: 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20  s open, then it 
bdd0: 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20  is "finalized". 
bde0: 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a  Once a journal .
bdf0: 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  ** file has been
be00: 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69 73   finalized it is
be10: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
be20: 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20   use it to roll 
be30: 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73  back a .** trans
be40: 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c  action. Nor will
be50: 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72 65   it be considere
be60: 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f  d to be a hot-jo
be70: 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a  urnal by this.**
be80: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64 61   or any other da
be90: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
bea0: 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 61  n. Exactly how a
beb0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61   journal is fina
bec0: 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73  lized.** depends
bed0: 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
bee0: 6f 74 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ot the pager is 
bef0: 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
bf00: 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a  sive mode and.**
bf10: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75   the current jou
bf20: 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72  rnal-mode (Pager
bf30: 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c  .journalMode val
bf40: 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ue), as follows:
bf50: 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
bf60: 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20  Mode==MEMORY.** 
bf70: 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
bf80: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 73   descriptor is s
bf90: 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68  imply closed. Th
bfa0: 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20 0a  is destroys an .
bfb0: 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79  **     in-memory
bfc0: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
bfd0: 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54    journalMode==T
bfe0: 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a  RUNCATE.**     J
bff0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
c000: 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
c010: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
c020: 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
c030: 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20  ode==PERSIST.** 
c040: 20 20 20 20 54 68 65 20 66 69 72 73 74 20 32 38      The first 28
c050: 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f   bytes of the jo
c060: 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20 7a  urnal file are z
c070: 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76 61  eroed. This inva
c080: 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20 74  lidates.**     t
c090: 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
c0a0: 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 66   header in the f
c0b0: 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20 74  ile, and hence t
c0c0: 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
c0d0: 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20 41  l.**     file. A
c0e0: 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61  n invalid journa
c0f0: 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65  l file cannot be
c100: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
c110: 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
c120: 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20  e==DELETE.**    
c130: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
c140: 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20  e is closed and 
c150: 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73 71  deleted using sq
c160: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e  lite3OsDelete().
c170: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74 68  .**.**     If th
c180: 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
c190: 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
c1a0: 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68 6f  mode, this metho
c1b0: 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a  d of finalizing.
c1c0: 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e  **     the journ
c1d0: 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72  al file is never
c1e0: 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c 20   used. Instead, 
c1f0: 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f  if the journalMo
c200: 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c  de is.**     DEL
c210: 45 54 45 20 61 6e 64 20 74 68 65 20 70 61 67 65  ETE and the page
c220: 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
c230: 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74 68  e mode, the meth
c240: 6f 64 20 64 65 73 63 72 69 62 65 64 20 75 6e 64  od described und
c250: 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  er.**     journa
c260: 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20 69  lMode==PERSIST i
c270: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
c280: 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  **.** After the 
c290: 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c  journal is final
c2a0: 69 7a 65 64 2c 20 69 66 20 72 75 6e 6e 69 6e 67  ized, if running
c2b0: 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69 76   in non-exclusiv
c2c0: 65 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 70  e mode, the.** p
c2d0: 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 50 41  ager moves to PA
c2e0: 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65  GER_SHARED state
c2f0: 20 28 61 6e 64 20 64 6f 77 6e 67 72 61 64 65 73   (and downgrades
c300: 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
c310: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
c320: 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 29 2e 0a  e accordingly)..
c330: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
c340: 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
c350: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20   exclusive mode 
c360: 61 6e 64 20 69 73 20 69 6e 20 50 41 47 45 52 5f  and is in PAGER_
c370: 53 59 4e 43 45 44 20 73 74 61 74 65 2c 0a 2a 2a  SYNCED state,.**
c380: 20 69 74 20 6d 6f 76 65 73 20 74 6f 20 50 41 47   it moves to PAG
c390: 45 52 5f 45 58 43 4c 55 53 49 56 45 2e 20 4e 6f  ER_EXCLUSIVE. No
c3a0: 20 6c 6f 63 6b 73 20 61 72 65 20 64 6f 77 6e 67   locks are downg
c3b0: 72 61 64 65 64 20 77 68 65 6e 20 72 75 6e 6e 69  raded when runni
c3c0: 6e 67 20 69 6e 0a 2a 2a 20 65 78 63 6c 75 73 69  ng in.** exclusi
c3d0: 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53  ve mode..**.** S
c3e0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
c3f0: 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72  rned if no error
c400: 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65   occurs. If an e
c410: 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
c420: 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74 68 65  ng.** any of the
c430: 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74   IO operations t
c440: 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
c450: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 75  ournal file or u
c460: 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74  nlock the.** dat
c470: 61 62 61 73 65 20 74 68 65 6e 20 74 68 65 20 49  abase then the I
c480: 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
c490: 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
c4a0: 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a 2a 2a  user. If the .**
c4b0: 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 66 69   operation to fi
c4c0: 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
c4d0: 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 74  al file fails, t
c4e0: 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73 74 69  hen the code sti
c4f0: 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f 20 75  ll.** tries to u
c500: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
c510: 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74 20 69  se file if not i
c520: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
c530: 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f  . If the.** unlo
c540: 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69  ck operation fai
c550: 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68 65 6e  ls as well, then
c560: 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72   the first error
c570: 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a 2a 2a   code related.**
c580: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 72   to the first er
c590: 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  ror encountered 
c5a0: 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6e  (the journal fin
c5b0: 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29 20 69  alization one) i
c5c0: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a  s.** returned..*
c5d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
c5e0: 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
c5f0: 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  on(Pager *pPager
c600: 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72 29  , int hasMaster)
c610: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
c620: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20  ITE_OK;      /* 
c630: 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  Error code from 
c640: 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61  journal finaliza
c650: 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a  tion operation *
c660: 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51  /.  int rc2 = SQ
c670: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20  LITE_OK;     /* 
c680: 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  Error code from 
c690: 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f  db file unlock o
c6a0: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69  peration */..  i
c6b0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
c6c0: 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  <PAGER_RESERVED 
c6d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
c6e0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
c6f0: 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
c700: 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  nts(pPager);..  
c710: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
c720: 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70  Pager->jfd) || p
c730: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
c740: 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  l==0 );.  if( is
c750: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
c760: 29 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  ) ){..    /* Fin
c770: 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
c780: 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  l file. */.    i
c790: 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a  f( sqlite3IsMemJ
c7a0: 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
c7b0: 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fd) ){.      ass
c7c0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
c7d0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
c7e0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
c7f0: 52 59 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  RY );.      sqli
c800: 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
c810: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c  r->jfd);.    }el
c820: 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
c830: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
c840: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
c850: 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20  UNCATE ){.      
c860: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
c870: 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  nalOff==0 ){.   
c880: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
c890: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _OK;.      }else
c8a0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
c8b0: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
c8c0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
c8d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c8e0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
c8f0: 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ff = 0;.      pP
c900: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
c910: 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65  rted = 0;.    }e
c920: 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
c930: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20  exclusiveMode . 
c940: 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a      || pPager->j
c950: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
c960: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
c970: 52 53 49 53 54 0a 20 20 20 20 29 7b 0a 20 20 20  RSIST.    ){.   
c980: 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72     rc = zeroJour
c990: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68  nalHdr(pPager, h
c9a0: 61 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  asMaster);.     
c9b0: 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
c9c0: 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
c9d0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
c9e0: 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ff = 0;.      pP
c9f0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
ca00: 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65  rted = 0;.    }e
ca10: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  lse{.      /* Th
ca20: 69 73 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65  is branch may be
ca30: 20 65 78 65 63 75 74 65 64 20 77 69 74 68 20 50   executed with P
ca40: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ager.journalMode
ca50: 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20  ==MEMORY if.    
ca60: 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e    ** a hot-journ
ca70: 61 6c 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c  al was just roll
ca80: 65 64 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73  ed back. In this
ca90: 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61   case the journa
caa0: 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20  l.      ** file 
cab0: 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64  should be closed
cac0: 20 61 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66   and deleted. If
cad0: 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
cae0: 20 77 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20   writes to.     
caf0: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
cb00: 20 66 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64   file, it will d
cb10: 6f 20 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e  o so using an in
cb20: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
cb30: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
cb40: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
cb50: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
cb60: 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
cb70: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
cb80: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
cb90: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
cba0: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
cbb0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71       );.      sq
cbc0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
cbd0: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
cbe0: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
cbf0: 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
cc00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
cc10: 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
cc20: 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
cc30: 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  urnal, 0);.     
cc40: 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66   }.    }..#ifdef
cc50: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
cc60: 47 45 53 0a 20 20 20 20 73 71 6c 69 74 65 33 50  GES.    sqlite3P
cc70: 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74  cacheIterateDirt
cc80: 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  y(pPager->pPCach
cc90: 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67  e, pager_set_pag
cca0: 65 68 61 73 68 29 3b 0a 23 65 6e 64 69 66 0a 0a  ehash);.#endif..
ccb0: 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
ccc0: 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72  eCleanAll(pPager
ccd0: 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20  ->pPCache);.    
cce0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
ccf0: 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
cd00: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50  Journal);.    pP
cd10: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
cd20: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
cd30: 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a  ->nRec = 0;.  }.
cd40: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
cd50: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
cd60: 0a 20 20 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c  .    rc2 = osUnl
cd70: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
cd80: 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
cd90: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
cda0: 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
cdb0: 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
cdc0: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
cdd0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
cde0: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
cdf0: 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20  R_SYNCED ){.    
ce00: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
ce10: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
ce20: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
ce30: 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
ce40: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
ce50: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
ce60: 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b 0a  dbModified = 0;.
ce70: 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 74  .  /* TODO: Is t
ce80: 68 69 73 20 6f 70 74 69 6d 61 6c 3f 20 57 68 79  his optimal? Why
ce90: 20 69 73 20 74 68 65 20 64 62 20 73 69 7a 65 20   is the db size 
cea0: 69 6e 76 61 6c 69 64 61 74 65 64 20 68 65 72 65  invalidated here
ceb0: 20 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20   .  ** when the 
cec0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
ced0: 20 6e 6f 74 20 75 6e 6c 6f 63 6b 65 64 3f 20 2a   not unlocked? *
cee0: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  /.  pPager->dbOr
cef0: 69 67 53 69 7a 65 20 3d 20 30 3b 0a 20 20 73 71  igSize = 0;.  sq
cf00: 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e 63  lite3PcacheTrunc
cf10: 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ate(pPager->pPCa
cf20: 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  che, pPager->dbS
cf30: 69 7a 65 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d  ize);.  if( !MEM
cf40: 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  DB ){.    pPager
cf50: 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
cf60: 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  0;.  }..  return
cf70: 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f   (rc==SQLITE_OK?
cf80: 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rc2:rc);.}../*.*
cf90: 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61 74  * Parameter aDat
cfa0: 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  a must point to 
cfb0: 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61 67  a buffer of pPag
cfc0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
cfd0: 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43  es.** of data. C
cfe0: 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
cff0: 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73  n a checksum bas
d000: 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65  ed ont the conte
d010: 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  nts of the .** p
d020: 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20  age of data and 
d030: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
d040: 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73  e of pPager->cks
d050: 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  umInit..**.** Th
d060: 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c  is is not a real
d070: 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73   checksum. It is
d080: 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65   really just the
d090: 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20   sum of the .** 
d0a0: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76  random initial v
d0b0: 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b  alue (pPager->ck
d0c0: 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65  sumInit) and eve
d0d0: 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a  ry 200th byte.**
d0e0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
d0f0: 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  a, starting with
d100: 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70 50   byte offset (pP
d110: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32  ager->pageSize%2
d120: 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74  00)..** Each byt
d130: 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  e is interpreted
d140: 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73   as an 8-bit uns
d150: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a  igned integer..*
d160: 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68  *.** Changing th
d170: 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74  e formula used t
d180: 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63  o compute this c
d190: 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20  hecksum results 
d1a0: 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61  in an.** incompa
d1b0: 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69  tible journal fi
d1c0: 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  le format..**.**
d1d0: 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72   If journal corr
d1e0: 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75  uption occurs du
d1f0: 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69  e to a power fai
d200: 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c  lure, the most l
d210: 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72  ikely .** scenar
d220: 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65  io is that one e
d230: 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  nd or the other 
d240: 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69  of the record wi
d250: 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a  ll be changed. .
d260: 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65  ** It is much le
d270: 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74  ss likely that t
d280: 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74  he two ends of t
d290: 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
d2a0: 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72  d will be.** cor
d2b0: 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64  rect and the mid
d2c0: 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20  dle be corrupt. 
d2d0: 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65   Thus, this "che
d2e0: 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a  cksum" scheme,.*
d2f0: 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e  * though fast an
d300: 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65  d simple, catche
d310: 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b  s the mostly lik
d320: 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72  ely kind of corr
d330: 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
d340: 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75  c u32 pager_cksu
d350: 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  m(Pager *pPager,
d360: 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61   const u8 *aData
d370: 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ){.  u32 cksum =
d380: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
d390: 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  it;         /* C
d3a0: 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f  hecksum value to
d3b0: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
d3c0: 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67   i = pPager->pag
d3d0: 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20  eSize-200;      
d3e0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
d3f0: 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ter */.  while( 
d400: 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d  i>0 ){.    cksum
d410: 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20   += aData[i];.  
d420: 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a    i -= 200;.  }.
d430: 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
d440: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
d450: 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d  single page from
d460: 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72   either the jour
d470: 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d  nal file (if isM
d480: 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a  ainJrnl==1) or.*
d490: 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  * from the sub-j
d4a0: 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69  ournal (if isMai
d4b0: 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c  nJrnl==0) and pl
d4c0: 61 79 62 61 63 6b 20 74 68 61 74 20 70 61 67 65  ayback that page
d4d0: 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65  ..** The page be
d4e0: 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a  gins at offset *
d4f0: 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65  pOffset into the
d500: 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66   file. The *pOff
d510: 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20  set.** value is 
d520: 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65  increased to the
d530: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65   start of the ne
d540: 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a  xt page in the j
d550: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
d560: 65 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 66 6c 61  e isMainJrnl fla
d570: 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 69  g is true if thi
d580: 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20 72 6f  s is the main ro
d590: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
d5a0: 6e 64 0a 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20  nd.** false for 
d5b0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
d5c0: 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 69 6e  urnal.  The main
d5d0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
d5e0: 6c 20 75 73 65 73 0a 2a 2a 20 63 68 65 63 6b 73  l uses.** checks
d5f0: 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d  ums - the statem
d600: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  ent journal does
d610: 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   not..**.** If t
d620: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
d630: 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72  f the page recor
d640: 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  d read from the 
d650: 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
d660: 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  le.** is greater
d670: 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
d680: 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  t value of Pager
d690: 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c  .dbSize, then pl
d6a0: 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69  ayback is.** ski
d6b0: 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  pped and SQLITE_
d6c0: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
d6d0: 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69  **.** If pDone i
d6e0: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
d6f0: 20 69 74 20 69 73 20 61 20 72 65 63 6f 72 64 20   it is a record 
d700: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61  of pages that ha
d710: 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65  ve already.** be
d720: 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  en played back. 
d730: 20 49 66 20 74 68 65 20 70 61 67 65 20 61 74 20   If the page at 
d740: 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72  *pOffset has alr
d750: 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64  eady been played
d760: 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65   back.** (if the
d770: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70   corresponding p
d780: 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74 29  Done bit is set)
d790: 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70   then skip the p
d7a0: 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65  layback..** Make
d7b0: 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20   sure the pDone 
d7c0: 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
d7d0: 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65  g to the *pOffse
d7e0: 74 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a  t page is set.**
d7f0: 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e   prior to return
d800: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ing..**.** If th
d810: 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 73  e page record is
d820: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65   successfully re
d830: 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
d840: 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  -)journal file.*
d850: 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63  * and played bac
d860: 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  k, then SQLITE_O
d870: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
d880: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
d890: 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65  curs.** while re
d8a0: 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64  ading the record
d8b0: 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
d8c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
d8d0: 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a  while writing.**
d8e0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
d8f0: 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20   file, then the 
d900: 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
d910: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61   returned. If da
d920: 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73  ta.** is success
d930: 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  fully read from 
d940: 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
d950: 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70 65 61  l file but appea
d960: 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72  rs to be.** corr
d970: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
d980: 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  NE is returned. 
d990: 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72  Data is consider
d9a0: 65 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a  ed corrupted in.
d9b0: 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61  ** two circumsta
d9c0: 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a  nces:.** .**   *
d9d0: 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 70   If the record p
d9e0: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c  age-number is il
d9f0: 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45  legal (0 or PAGE
da00: 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a  R_MJ_PGNO), or.*
da10: 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63  *   * If the rec
da20: 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  ord is being rol
da30: 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  led back from th
da40: 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
da50: 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ile.**     and t
da60: 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c  he checksum fiel
da70: 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  d does not match
da80: 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74   the record cont
da90: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68  ent..**.** Neith
daa0: 65 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20  er of these two 
dab0: 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f  scenarios are po
dac0: 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20  ssible during a 
dad0: 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
dae0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ck..**.** If thi
daf0: 73 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  s is a savepoint
db00: 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
db10: 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20  memory may have 
db20: 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
db30: 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62  y.** allocated b
db40: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
db50: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
db60: 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f  case and an allo
db70: 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a  cation fails,.**
db80: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
db90: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
dba0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
dbb0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
dbc0: 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
dbd0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
dbe0: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62    /* The pager b
dbf0: 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b  eing played back
dc00: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e   */.  int isMain
dc10: 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Jrnl,           
dc20: 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e      /* 1 -> main
dc30: 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73   journal. 0 -> s
dc40: 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  ub-journal. */. 
dc50: 20 69 6e 74 20 69 73 55 6e 73 79 6e 63 2c 20 20   int isUnsync,  
dc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dc70: 2a 20 54 72 75 65 20 69 66 20 72 65 61 64 69 6e  * True if readin
dc80: 67 20 66 72 6f 6d 20 75 6e 73 79 6e 63 65 64 20  g from unsynced 
dc90: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  main journal */.
dca0: 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20    i64 *pOffset, 
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcc0: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63  /* Offset of rec
dcd0: 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ord to playback 
dce0: 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65 70  */.  int isSavep
dcf0: 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nt,             
dd00: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
dd10: 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
dd20: 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ack */.  Bitvec 
dd30: 2a 70 44 6f 6e 65 20 20 20 20 20 20 20 20 20 20  *pDone          
dd40: 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
dd50: 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64   of pages alread
dd60: 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f  y played back */
dd70: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
dd80: 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20  PgHdr *pPg;     
dd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dda0: 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67   An existing pag
ddb0: 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a  e in the cache *
ddc0: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dde0: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
ddf0: 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69  mber of a page i
de00: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  n journal */.  u
de10: 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
de20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
de30: 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f  Checksum used fo
de40: 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  r sanity checkin
de50: 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61  g */.  u8 *aData
de60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
de70: 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
de80: 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68  y storage for th
de90: 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69  e page */.  sqli
dea0: 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20  te3_file *jfd;  
deb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
dec0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
ded0: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
dee0: 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65   file */..  asse
def0: 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26  rt( (isMainJrnl&
df00: 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  ~1)==0 );      /
df10: 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20  * isMainJrnl is 
df20: 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
df30: 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e  rt( (isSavepnt&~
df40: 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f  1)==0 );       /
df50: 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30  * isSavepnt is 0
df60: 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
df70: 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c  t( isMainJrnl ||
df80: 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a   pDone );     /*
df90: 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73   pDone always us
dfa0: 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61  ed on sub-journa
dfb0: 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ls */.  assert( 
dfc0: 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f  isSavepnt || pDo
dfd0: 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44  ne==0 );   /* pD
dfe0: 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f  one never used o
dff0: 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20  n non-savepoint 
e000: 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 28 75  */..  aData = (u
e010: 38 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  8*)pPager->pTmpS
e020: 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28 20  pace;.  assert( 
e030: 61 44 61 74 61 20 29 3b 20 20 20 20 20 20 20 20  aData );        
e040: 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65   /* Temp storage
e050: 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61   must have alrea
e060: 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
e070: 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20  d */..  /* Read 
e080: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
e090: 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66 72  and page data fr
e0a0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f  om the journal o
e0b0: 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20  r sub-journal.  
e0c0: 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20  ** file. Return 
e0d0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  an error code to
e0e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61   the caller if a
e0f0: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
e100: 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20  s..  */.  jfd = 
e110: 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61  isMainJrnl ? pPa
e120: 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65  ger->jfd : pPage
e130: 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20  r->sjfd;.  rc = 
e140: 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
e150: 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29  *pOffset, &pgno)
e160: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
e170: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
e180: 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
e190: 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 61 44 61  3OsRead(jfd, aDa
e1a0: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
e1b0: 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29  Size, (*pOffset)
e1c0: 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  +4);.  if( rc!=S
e1d0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
e1e0: 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74  n rc;.  *pOffset
e1f0: 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
e200: 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69  Size + 4 + isMai
e210: 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53  nJrnl*4;..  /* S
e220: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
e230: 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
e240: 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
e250: 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
e260: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
e270: 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
e280: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
e290: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
e2a0: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
e2b0: 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
e2c0: 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
e2d0: 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
e2e0: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
e2f0: 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
e300: 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
e310: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
e320: 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
e330: 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
e340: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
e350: 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
e360: 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
e370: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
e380: 73 65 72 74 28 20 21 69 73 53 61 76 65 70 6e 74  sert( !isSavepnt
e390: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
e3a0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
e3b0: 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f    if( pgno>(Pgno
e3c0: 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  )pPager->dbSize 
e3d0: 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  || sqlite3Bitvec
e3e0: 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f  Test(pDone, pgno
e3f0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
e400: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
e410: 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
e420: 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  ){.    rc = read
e430: 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f  32bits(jfd, (*pO
e440: 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d  ffset)-4, &cksum
e450: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
e460: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
e470: 66 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26  f( !isSavepnt &&
e480: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
e490: 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63 6b 73  ger, aData)!=cks
e4a0: 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  um ){.      retu
e4b0: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
e4c0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
e4d0: 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20   pDone && (rc = 
e4e0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
e4f0: 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d  (pDone, pgno))!=
e500: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e510: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
e520: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
e530: 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
e540: 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67  RESERVED || pPag
e550: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
e560: 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20  _EXCLUSIVE );.. 
e570: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
e580: 20 69 73 20 69 6e 20 52 45 53 45 52 56 45 44 20   is in RESERVED 
e590: 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72  state, then ther
e5a0: 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79  e must be a copy
e5b0: 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61   of this.  ** pa
e5c0: 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  ge in the pager 
e5d0: 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63  cache. In this c
e5e0: 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20  ase just update 
e5f0: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c  the pager cache,
e600: 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61  .  ** not the da
e610: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
e620: 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61   page is left ma
e630: 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68  rked dirty in th
e640: 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  is case..  **.  
e650: 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20  ** An exception 
e660: 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c  to the above rul
e670: 65 3a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  e: If the databa
e680: 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  se is in no-sync
e690: 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61   mode.  ** and a
e6a0: 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64   page is moved d
e6b0: 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65  uring an increme
e6c0: 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e  ntal vacuum then
e6d0: 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20   the page may.  
e6e0: 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65  ** not be in the
e6f0: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61   pager cache. La
e700: 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63  ter: if a malloc
e710: 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f  () or IO error o
e720: 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e  ccurs.  ** durin
e730: 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63  g a Movepage() c
e740: 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61  all, then the pa
e750: 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  ge may not be in
e760: 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20   the cache.  ** 
e770: 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63  either. So the c
e780: 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62  ondition describ
e790: 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20  ed in the above 
e7a0: 70 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74  paragraph is not
e7b0: 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62  .  ** assert()ab
e7c0: 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  le..  **.  ** If
e7d0: 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73 74   in EXCLUSIVE st
e7e0: 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64  ate, then we upd
e7f0: 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61  ate the pager ca
e800: 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73  che if it exists
e810: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61  .  ** and the ma
e820: 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  in file. The pag
e830: 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64  e is then marked
e840: 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a   not dirty..  **
e850: 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31  .  ** Ticket #11
e860: 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65  71:  The stateme
e870: 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  nt journal might
e880: 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f   contain page co
e890: 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20  ntent that is.  
e8a0: 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  ** different fro
e8b0: 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  m the page conte
e8c0: 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nt at the start 
e8d0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
e8e0: 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63  on..  ** This oc
e8f0: 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65  curs when a page
e900: 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f   is changed prio
e910: 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
e920: 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  f a statement.  
e930: 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20  ** then changed 
e940: 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65  again within the
e950: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65   statement.  Whe
e960: 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73  n rolling back s
e970: 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65  uch a.  ** state
e980: 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74  ment we must not
e990: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72   write to the or
e9a0: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
e9b0: 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20  unless we know. 
e9c0: 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20   ** for certain 
e9d0: 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61  that original pa
e9e0: 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
e9f0: 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20  synced into the 
ea00: 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  main rollback.  
ea10: 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68  ** journal.  Oth
ea20: 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20  erwise, a power 
ea30: 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65  loss might leave
ea40: 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69   modified data i
ea50: 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
ea60: 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74  ase file without
ea70: 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
ea80: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
ea90: 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20  l that can.  ** 
eaa0: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
eab0: 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67  base to its orig
eac0: 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20  inal form.  Two 
ead0: 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20  conditions must 
eae0: 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f  be.  ** met befo
eaf0: 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  re writing to th
eb00: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  e database files
eb10: 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61  . (1) the databa
eb20: 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  se must be.  ** 
eb30: 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20  locked.  (2) we 
eb40: 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72  know that the or
eb50: 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
eb60: 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e  ent is fully syn
eb70: 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ced.  ** in the 
eb80: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74  main journal eit
eb90: 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20  her because the 
eba0: 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
ebb0: 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a  ache or else.  *
ebc0: 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61  * the page is ma
ebd0: 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63  rked as needSync
ebe0: 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32  ==0..  **.  ** 2
ebf0: 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e  008-04-14:  When
ec00: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76   attempting to v
ec10: 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20  acuum a corrupt 
ec20: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
ec30: 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
ec40: 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61  le to fail a sta
ec50: 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61  tement on a data
ec60: 62 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e  base that does n
ec70: 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20  ot yet exist..  
ec80: 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70  ** Do not attemp
ec90: 74 20 74 6f 20 77 72 69 74 65 20 69 66 20 64 61  t to write if da
eca0: 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
ecb0: 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65  never been opene
ecc0: 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20  d..  */.  pPg = 
ecd0: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
ece0: 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73  ger, pgno);.  as
ecf0: 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45  sert( pPg || !ME
ed00: 4d 44 42 20 29 3b 0a 20 20 50 41 47 45 52 54 52  MDB );.  PAGERTR
ed10: 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25  ACE(("PLAYBACK %
ed20: 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
ed30: 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20  08x) %s\n",.    
ed40: 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
ed50: 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
ed60: 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  , pager_datahash
ed70: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
ed80: 65 2c 20 61 44 61 74 61 29 2c 0a 20 20 20 20 20  e, aData),.     
ed90: 20 20 20 20 20 20 20 20 20 20 28 69 73 4d 61 69            (isMai
eda0: 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72  nJrnl?"main-jour
edb0: 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61  nal":"sub-journa
edc0: 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20  l").  ));.  if( 
edd0: 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d  (pPager->state>=
ede0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 29  PAGER_EXCLUSIVE)
edf0: 0a 20 20 20 26 26 20 28 70 50 67 3d 3d 30 20 7c  .   && (pPg==0 |
ee00: 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73  | 0==(pPg->flags
ee10: 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
ee20: 29 29 0a 20 20 20 26 26 20 69 73 4f 70 65 6e 28  )).   && isOpen(
ee30: 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20 26  pPager->fd).   &
ee40: 26 20 21 69 73 55 6e 73 79 6e 63 0a 20 20 29 7b  & !isUnsync.  ){
ee50: 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20  .    i64 ofst = 
ee60: 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
ee70: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
ee80: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ee90: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
eea0: 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  fd, aData, pPage
eeb0: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73  r->pageSize, ofs
eec0: 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f  t);.    if( pgno
eed0: 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
eee0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ize ){.      pPa
eef0: 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
ef00: 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  = pgno;.    }.  
ef10: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42    if( pPager->pB
ef20: 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 43  ackup ){.      C
ef30: 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61 44  ODEC1(pPager, aD
ef40: 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63  ata, pgno, 3, rc
ef50: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a  =SQLITE_NOMEM);.
ef60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63        sqlite3Bac
ef70: 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
ef80: 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c  ->pBackup, pgno,
ef90: 20 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 43   aData);.      C
efa0: 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61 44  ODEC1(pPager, aD
efb0: 61 74 61 2c 20 70 67 6e 6f 2c 20 30 2c 20 72 63  ata, pgno, 0, rc
efc0: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a  =SQLITE_NOMEM);.
efd0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
efe0: 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26  ( !isMainJrnl &&
eff0: 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pPg==0 ){.    /
f000: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72  * If this is a r
f010: 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73 61 76  ollback of a sav
f020: 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74 61 20  epoint and data 
f030: 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20  was not written 
f040: 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  to.    ** the da
f050: 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20 70  tabase and the p
f060: 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65  age is not in-me
f070: 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73 20 61  mory, there is a
f080: 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a   potential.    *
f090: 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20  * problem. When 
f0a0: 74 68 65 20 70 61 67 65 20 69 73 20 6e 65 78 74  the page is next
f0b0: 20 66 65 74 63 68 65 64 20 62 79 20 74 68 65 20   fetched by the 
f0c0: 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20 69 74  b-tree layer, it
f0d0: 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65   .    ** will be
f0e0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
f0f0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68  atabase file, wh
f100: 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ich may or may n
f110: 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20 63 75  ot be .    ** cu
f120: 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20  rrent. .    **. 
f130: 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20     ** There are 
f140: 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66  a couple of diff
f150: 65 72 65 6e 74 20 77 61 79 73 20 74 68 69 73 20  erent ways this 
f160: 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20  can happen. All 
f170: 61 72 65 20 71 75 69 74 65 0a 20 20 20 20 2a 2a  are quite.    **
f180: 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e 20 72   obscure. When r
f190: 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68 72  unning in synchr
f1a0: 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69 73  onous mode, this
f1b0: 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
f1c0: 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20   .    ** if the 
f1d0: 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65 20 66  page is on the f
f1e0: 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68 65 20  ree-list at the 
f1f0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
f200: 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20  nsaction, then. 
f210: 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c     ** populated,
f220: 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e   then moved usin
f230: 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  g sqlite3PagerMo
f240: 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a  vepage()..    **
f250: 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75  .    ** The solu
f260: 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64 20 61  tion is to add a
f270: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  n in-memory page
f280: 20 74 6f 20 74 68 65 20 63 61 63 68 65 20 63 6f   to the cache co
f290: 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  ntaining.    ** 
f2a0: 74 68 65 20 64 61 74 61 20 6a 75 73 74 20 72 65  the data just re
f2b0: 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ad from the sub-
f2c0: 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68  journal. Mark th
f2d0: 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 20  e page as dirty 
f2e0: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74  .    ** and if t
f2f0: 68 65 20 70 61 67 65 72 20 72 65 71 75 69 72 65  he pager require
f300: 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63  s a journal-sync
f310: 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68 65 20  , then mark the 
f320: 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a 2a 20  page as .    ** 
f330: 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f 75 72  requiring a jour
f340: 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65 20  nal-sync before 
f350: 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20  it is written.. 
f360: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
f370: 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20  ( isSavepnt );. 
f380: 20 20 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c     if( (rc = sql
f390: 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
f3a0: 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26  (pPager, pgno, &
f3b0: 70 50 67 2c 20 31 29 29 21 3d 53 51 4c 49 54 45  pPg, 1))!=SQLITE
f3c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
f3d0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
f3e0: 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20    pPg->flags &= 
f3f0: 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44  ~PGHDR_NEED_READ
f400: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
f410: 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
f420: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  );.  }.  if( pPg
f430: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
f440: 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
f450: 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
f460: 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
f470: 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
f480: 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
f490: 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
f4a0: 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
f4b0: 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
f4c0: 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
f4d0: 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
f4e0: 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
f4f0: 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
f500: 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
f510: 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
f520: 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
f530: 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
f540: 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
f550: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
f560: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
f570: 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
f580: 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74  *pData;.    pDat
f590: 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
f5a0: 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
f5b0: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
f5c0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
f5d0: 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
f5e0: 72 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20  r(pPg);.    if( 
f5f0: 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21  isMainJrnl && (!
f600: 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a 70 4f  isSavepnt || *pO
f610: 66 66 73 65 74 3c 3d 70 50 61 67 65 72 2d 3e 6a  ffset<=pPager->j
f620: 6f 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20  ournalHdr) ){.  
f630: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
f640: 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70  ntents of this p
f650: 61 67 65 20 77 65 72 65 20 6a 75 73 74 20 72 65  age were just re
f660: 73 74 6f 72 65 64 20 66 72 6f 6d 20 74 68 65 20  stored from the 
f670: 6d 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a  main .      ** j
f680: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
f690: 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75  n its content mu
f6a0: 73 74 20 62 65 20 61 73 20 74 68 65 79 20 77 65  st be as they we
f6b0: 72 65 20 77 68 65 6e 20 74 68 65 20 0a 20 20 20  re when the .   
f6c0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
f6d0: 6e 20 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e  n was first open
f6e0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
f6f0: 20 77 65 20 63 61 6e 20 6d 61 72 6b 20 74 68 65   we can mark the
f700: 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 61   page.      ** a
f710: 73 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74  s clean, since t
f720: 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20  here will be no 
f730: 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 69 74  need to write it
f740: 20 6f 75 74 20 74 6f 20 74 68 65 2e 0a 20 20 20   out to the..   
f750: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
f760: 68 65 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65  here is one exce
f770: 70 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75  ption to this ru
f780: 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  le. If the page 
f790: 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a  is being rolled.
f7a0: 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73        ** back as
f7b0: 20 70 61 72 74 20 6f 66 20 61 20 73 61 76 65 70   part of a savep
f7c0: 6f 69 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65  oint (or stateme
f7d0: 6e 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f  nt) rollback fro
f7e0: 6d 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75  m an .      ** u
f7f0: 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20  nsynced portion 
f800: 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
f810: 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  nal file, then i
f820: 74 20 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20  t is not safe.  
f830: 20 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74      ** to mark t
f840: 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
f850: 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
f860: 65 20 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61  e marking the pa
f870: 67 65 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63  ge as.      ** c
f880: 6c 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20  lean will clear 
f890: 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
f8a0: 59 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20  YNC flag. Since 
f8b0: 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 20 20  the page is.    
f8c0: 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20    ** already in 
f8d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
f8e0: 20 28 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61   (recorded in Pa
f8f0: 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20  ger.pInJournal) 
f900: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  and.      ** the
f910: 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
f920: 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64   flag is cleared
f930: 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  , if the page is
f940: 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20   written to.    
f950: 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69    ** again withi
f960: 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
f970: 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d  on, it will be m
f980: 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 62  arked as dirty b
f990: 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ut.      ** the 
f9a0: 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
f9b0: 66 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65  flag will not be
f9c0: 20 73 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74   set. It could t
f9d0: 68 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a  hen potentially.
f9e0: 20 20 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74        ** be writ
f9f0: 74 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65  ten out into the
fa00: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
fa10: 65 66 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61  efore its journa
fa20: 6c 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  l file.      ** 
fa30: 73 65 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65  segment is synce
fa40: 64 2e 20 49 66 20 61 20 63 72 61 73 68 20 6f 63  d. If a crash oc
fa50: 63 75 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66  curs during or f
fa60: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20  ollowing this,. 
fa70: 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
fa80: 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20   corruption may 
fa90: 65 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  ensue..      */.
faa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
fab0: 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67  cheMakeClean(pPg
fac0: 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
fad0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
fae0: 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
faf0: 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
fb00: 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
fb10: 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  if.    /* If thi
fb20: 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68  s was page 1, th
fb30: 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76  en restore the v
fb40: 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
fb50: 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a  FileVers..    **
fb60: 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20   Do this before 
fb70: 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f  any decoding. */
fb80: 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  .    if( pgno==1
fb90: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
fba0: 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
fbb0: 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61  Vers, &((u8*)pDa
fbc0: 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70  ta)[24],sizeof(p
fbd0: 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
fbe0: 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s));.    }..    
fbf0: 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61  /* Decode the pa
fc00: 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ge just read fro
fc10: 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f  m disk */.    CO
fc20: 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61  DEC1(pPager, pDa
fc30: 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  ta, pPg->pgno, 3
fc40: 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
fc50: 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  M);.    sqlite3P
fc60: 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67  cacheRelease(pPg
fc70: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
fc80: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  rc;.}../*.** Par
fc90: 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69  ameter zMaster i
fca0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
fcb0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
fcc0: 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f  ile. A single jo
fcd0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68  urnal.** file th
fce0: 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74  at referred to t
fcf0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
fd00: 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20  l file has just 
fd10: 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
fd20: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
fd30: 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69  e checks if it i
fd40: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
fd50: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
fd60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a  journal file,.**
fd70: 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20   and does so if 
fd80: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67  it is..**.** Arg
fd90: 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61  ument zMaster ma
fda0: 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72  y point to Pager
fdb0: 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74  .pTmpSpace. So t
fdc0: 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f  hat buffer is no
fdd0: 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  t .** available 
fde0: 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20 74  for use within t
fdf0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
fe00: 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74 65  .** When a maste
fe10: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
fe20: 73 20 63 72 65 61 74 65 64 2c 20 69 74 20 69 73  s created, it is
fe30: 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
fe40: 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66  the names .** of
fe50: 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c   all of its chil
fe60: 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20  d journals, one 
fe70: 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20 66  after another, f
fe80: 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74 66 2d  ormatted as utf-
fe90: 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65  8 .** encoded te
fea0: 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20 65  xt. The end of e
feb0: 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  ach child journa
fec0: 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65 64  l file is marked
fed0: 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d   with a .** nul-
fee0: 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
fef0: 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68 65  (0x00). i.e. the
ff00: 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
ff10: 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
ff20: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72  rnal.** file for
ff30: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
ff40: 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61 74  nvolving two dat
ff50: 61 62 61 73 65 73 20 6d 69 67 68 74 20 62 65 3a  abases might be:
ff60: 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f  .**.**   "/home/
ff70: 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61  bill/a.db-journa
ff80: 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  l\x00/home/bill/
ff90: 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  b.db-journal\x00
ffa0: 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72  ".**.** A master
ffb0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61   journal file ma
ffc0: 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74 65  y only be delete
ffd0: 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74  d once all of it
ffe0: 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72  s child .** jour
fff0: 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20 72  nals have been r
10000 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
10010 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
10020 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65 6e  reads the conten
10030 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ts of the master
10040 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e  -journal file in
10050 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e  to .** memory an
10060 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  d loops through 
10070 65 61 63 68 20 6f 66 20 74 68 65 20 63 68 69 6c  each of the chil
10080 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e  d journal names.
10090 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68 69   For.** each chi
100a0 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63  ld journal, it c
100b0 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20  hecks if:.**.** 
100c0 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64    * if the child
100d0 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2c   journal exists,
100e0 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20   and if so.**   
100f0 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a  * if the child j
10100 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20  ournal contains 
10110 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 6d  a reference to m
10120 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a  aster journal .*
10130 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73 74  *     file zMast
10140 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68  er.**.** If a ch
10150 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ild journal can 
10160 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d 61  be found that ma
10170 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74 68  tches both of th
10180 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61 62  e criteria.** ab
10190 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ove, this functi
101a0 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f  on returns witho
101b0 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
101c0 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  g. Otherwise, if
101d0 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69 6c  .** no such chil
101e0 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  d journal can be
101f0 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61   found, file zMa
10200 73 74 65 72 20 69 73 20 64 65 6c 65 74 65 64 20  ster is deleted 
10210 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65  from.** the file
10220 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73 71  -system using sq
10230 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e  lite3OsDelete().
10240 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
10250 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68 69  error within thi
10260 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65  s function, an e
10270 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
10280 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66  urned. This.** f
10290 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
102a0 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c  s memory by call
102b0 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  ing sqlite3Mallo
102c0 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63  c(). If an alloc
102d0 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20  ation.** fails, 
102e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
102f0 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
10300 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72  ise, if no IO or
10310 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a   malloc errors .
10320 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45  ** occur, SQLITE
10330 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
10340 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69  .**.** TODO: Thi
10350 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  s function alloc
10360 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 6c  ates a single bl
10370 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f  ock of memory to
10380 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74   load.** the ent
10390 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
103a0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
103b0 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f  al file. This co
103c0 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70  uld be.** a coup
103d0 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20  le of kilobytes 
103e0 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61  or so - potentia
103f0 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20  lly larger than 
10400 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a  the page .** siz
10410 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
10420 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
10430 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
10440 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
10450 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ter){.  sqlite3_
10460 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
10470 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
10480 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
10490 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
104a0 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  code */.  sqlite
104b0 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b  3_file *pMaster;
104c0 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20      /* Malloc'd 
104d0 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
104e0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
104f0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
10500 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a   *pJournal;   /*
10510 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d   Malloc'd child-
10520 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
10530 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61  criptor */.  cha
10540 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r *zMasterJourna
10550 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e  l = 0; /* Conten
10560 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ts of master jou
10570 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
10580 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  64 nMasterJourna
10590 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  l;       /* Size
105a0 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
105b0 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a  al file */..  /*
105c0 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
105d0 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f  for both the pJo
105e0 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65  urnal and pMaste
105f0 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
10600 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63  rs..  ** If succ
10610 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65  essful, open the
10620 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10630 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67  file for reading
10640 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72  ..  */.  pMaster
10650 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
10660 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
10670 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46  Zero(pVfs->szOsF
10680 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75  ile * 2);.  pJou
10690 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f  rnal = (sqlite3_
106a0 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70  file *)(((u8 *)p
106b0 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e  Master) + pVfs->
106c0 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28  szOsFile);.  if(
106d0 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20   !pMaster ){.   
106e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
106f0 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  EM;.  }else{.   
10700 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
10710 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
10720 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
10730 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
10740 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  NAL);.    rc = s
10750 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
10760 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73  s, zMaster, pMas
10770 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  ter, flags, 0);.
10780 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
10790 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
107a0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
107b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
107c0 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c  ileSize(pMaster,
107d0 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &nMasterJournal
107e0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
107f0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
10800 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
10810 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  if( nMasterJourn
10820 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72  al>0 ){.    char
10830 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20   *zJournal;.    
10840 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72  char *zMasterPtr
10850 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d   = 0;.    int nM
10860 61 73 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d  asterPtr = pVfs-
10870 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 0a  >mxPathname+1;..
10880 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20      /* Load the 
10890 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f  entire master jo
108a0 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  urnal file into 
108b0 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
108c0 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  rom.    ** sqlit
108d0 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  e3_malloc() and 
108e0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
108f0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20  asterJournal. . 
10900 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65     */.    zMaste
10910 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  rJournal = sqlit
10920 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d  e3Malloc((int)nM
10930 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e  asterJournal + n
10940 4d 61 73 74 65 72 50 74 72 20 2b 20 31 29 3b 0a  MasterPtr + 1);.
10950 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72      if( !zMaster
10960 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
10970 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
10980 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64  EM;.      goto d
10990 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
109a0 20 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65 72 50    }.    zMasterP
109b0 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75  tr = &zMasterJou
109c0 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72  rnal[nMasterJour
109d0 6e 61 6c 2b 31 5d 3b 0a 20 20 20 20 72 63 20 3d  nal+1];.    rc =
109e0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
109f0 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a  Master, zMasterJ
10a00 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61  ournal, (int)nMa
10a10 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  sterJournal, 0);
10a20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
10a30 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
10a40 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
10a50 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b   zMasterJournal[
10a60 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20  nMasterJournal] 
10a70 3d 20 30 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e  = 0;..    zJourn
10a80 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72  al = zMasterJour
10a90 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  nal;.    while( 
10aa0 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65  (zJournal-zMaste
10ab0 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65  rJournal)<nMaste
10ac0 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
10ad0 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20    int exists;.  
10ae0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10af0 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
10b00 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
10b10 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
10b20 65 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20 69  exists);.      i
10b30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10b40 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
10b50 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
10b60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
10b70 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20  ( exists ){.    
10b80 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
10b90 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74  e journals point
10ba0 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73  ed to by the mas
10bb0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ter journal exis
10bc0 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  ts..        ** O
10bd0 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b  pen it and check
10be0 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74   if it points at
10bf0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
10c00 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20  nal. If.        
10c10 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69  ** so, return wi
10c20 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74  thout deleting t
10c30 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10c40 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  l file..        
10c50 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  */.        int c
10c60 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c  ;.        int fl
10c70 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
10c80 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
10c90 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
10ca0 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20 72  RNAL);.        r
10cb0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
10cc0 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  n(pVfs, zJournal
10cd0 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67  , pJournal, flag
10ce0 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  s, 0);.        i
10cf0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10d00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
10d10 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
10d20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
10d30 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61       rc = readMa
10d40 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75  sterJournal(pJou
10d50 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72  rnal, zMasterPtr
10d60 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  , nMasterPtr);. 
10d70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
10d80 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b  Close(pJournal);
10d90 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
10da0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10db0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
10dc0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
10dd0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63      }..        c
10de0 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d   = zMasterPtr[0]
10df0 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d  !=0 && strcmp(zM
10e00 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65  asterPtr, zMaste
10e10 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 69  r)==0;.        i
10e20 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20  f( c ){.        
10e30 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d    /* We have a m
10e40 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c  atch. Do not del
10e50 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
10e60 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a  ournal file. */.
10e70 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
10e80 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
10e90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
10ea0 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b        zJournal +
10eb0 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  = (sqlite3Strlen
10ec0 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b  30(zJournal)+1);
10ed0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
10ee0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
10ef0 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
10f00 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74  er, 0);..delmast
10f10 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d  er_out:.  if( zM
10f20 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
10f30 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
10f40 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  (zMasterJournal)
10f50 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 70 4d  ;.  }  .  if( pM
10f60 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  aster ){.    sql
10f70 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73  ite3OsClose(pMas
10f80 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ter);.    assert
10f90 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e  ( !isOpen(pJourn
10fa0 61 6c 29 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  al) );.  }.  sql
10fb0 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65  ite3_free(pMaste
10fc0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
10fd0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
10fe0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
10ff0 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 61   to change the a
11000 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  ctual size of th
11010 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66  e database .** f
11020 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  ile in the file-
11030 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c  system. This onl
11040 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63  y happens when c
11050 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
11060 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72  saction,.** or r
11070 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
11080 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75  ansaction (inclu
11090 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63  ding rolling bac
110a0 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29  k a hot-journal)
110b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d  ..**.** If the m
110c0 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
110d0 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f  e is not open, o
110e0 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
110f0 6f 63 6b 20 69 73 20 6e 6f 74 0a 2a 2a 20 68 65  ock is not.** he
11100 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ld, this functio
11110 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74  n is a no-op. Ot
11120 68 65 72 77 69 73 65 2c 20 74 68 65 20 73 69 7a  herwise, the siz
11130 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  e of the file is
11140 0a 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f 20 6e  .** changed to n
11150 50 61 67 65 20 70 61 67 65 73 20 28 6e 50 61 67  Page pages (nPag
11160 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e*pPager->pageSi
11170 7a 65 20 62 79 74 65 73 29 2e 20 49 66 20 74 68  ze bytes). If th
11180 65 20 66 69 6c 65 0a 2a 2a 20 6f 6e 20 64 69 73  e file.** on dis
11190 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6c  k is currently l
111a0 61 72 67 65 72 20 74 68 61 6e 20 6e 50 61 67 65  arger than nPage
111b0 20 70 61 67 65 73 2c 20 74 68 65 6e 20 75 73 65   pages, then use
111c0 20 74 68 65 20 56 46 53 0a 2a 2a 20 78 54 72 75   the VFS.** xTru
111d0 6e 63 61 74 65 28 29 20 6d 65 74 68 6f 64 20 74  ncate() method t
111e0 6f 20 74 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a  o truncate it..*
111f0 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68  *.** Or, it migh
11200 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63  t might be the c
11210 61 73 65 20 74 68 61 74 20 74 68 65 20 66 69 6c  ase that the fil
11220 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61  e on disk is sma
11230 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50  ller than .** nP
11240 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20  age pages. Some 
11250 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
11260 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
11270 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65   can get confuse
11280 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79  d if .** you try
11290 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66   to truncate a f
112a0 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65  ile to some size
112b0 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20   that is larger 
112c0 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72  than it .** curr
112d0 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74  ently is, so det
112e0 65 63 74 20 74 68 69 73 20 63 61 73 65 20 61 6e  ect this case an
112f0 64 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65  d write a single
11300 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a   zero byte to .*
11310 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  * the end of the
11320 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61   new file instea
11330 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  d..**.** If succ
11340 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53  essful, return S
11350 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20  QLITE_OK. If an 
11360 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
11370 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a  while modifying.
11380 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
11390 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65  file, return the
113a0 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
113b0 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74  he caller..*/.st
113c0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74  atic int pager_t
113d0 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
113e0 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
113f0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
11400 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
11410 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
11420 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26  AGER_EXCLUSIVE &
11430 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
11440 3e 66 64 29 20 29 7b 0a 20 20 20 20 69 36 34 20  >fd) ){.    i64 
11450 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77  currentSize, new
11460 53 69 7a 65 3b 0a 20 20 20 20 2f 2a 20 54 4f 44  Size;.    /* TOD
11470 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20 74 6f  O: Is it safe to
11480 20 75 73 65 20 50 61 67 65 72 2e 64 62 46 69 6c   use Pager.dbFil
11490 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20  eSize here? */. 
114a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
114b0 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
114c0 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69  ->fd, &currentSi
114d0 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65  ze);.    newSize
114e0 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
114f0 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a  ize*(i64)nPage;.
11500 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
11510 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74  TE_OK && current
11520 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b  Size!=newSize ){
11530 0a 20 20 20 20 20 20 69 66 28 20 63 75 72 72 65  .      if( curre
11540 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29  ntSize>newSize )
11550 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
11560 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
11570 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77  (pPager->fd, new
11580 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Size);.      }el
11590 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
115a0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
115b0 70 50 61 67 65 72 2d 3e 66 64 2c 20 22 22 2c 20  pPager->fd, "", 
115c0 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29 3b 0a 20  1, newSize-1);. 
115d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
115e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
115f0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
11600 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e  ->dbFileSize = n
11610 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Page;.      }.  
11620 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
11630 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
11640 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
11650 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  he Pager.sectorS
11660 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f 72  ize variable for
11670 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61   the given.** pa
11680 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ger based on the
11690 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
116a0 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69  by the xSectorSi
116b0 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20  ze method.** of 
116c0 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
116d0 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65 63 74  e file. The sect
116e0 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
116f0 75 73 65 64 20 75 73 65 64 20 0a 2a 2a 20 74 6f  used used .** to
11700 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73   determine the s
11710 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e  ize and alignmen
11720 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  t of journal hea
11730 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74  der and .** mast
11740 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
11750 65 72 73 20 77 69 74 68 69 6e 20 63 72 65 61 74  ers within creat
11760 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ed journal files
11770 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70  ..**.** For temp
11780 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68 65 20  orary files the 
11790 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72  effective sector
117a0 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20   size is always 
117b0 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  512 bytes..**.**
117c0 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20   Otherwise, for 
117d0 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66 69  non-temporary fi
117e0 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63 74 69  les, the effecti
117f0 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  ve sector size i
11800 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72  s.** the value r
11810 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78  eturned by the x
11820 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d 65 74  SectorSize() met
11830 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70 20 74  hod rounded up t
11840 6f 20 35 31 32 20 69 66 0a 2a 2a 20 69 74 20 69  o 512 if.** it i
11850 73 20 6c 65 73 73 20 74 68 61 6e 20 35 31 32 2c  s less than 512,
11860 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e   or rounded down
11870 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53   to MAX_SECTOR_S
11880 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20  IZE if it.** is 
11890 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58  greater than MAX
118a0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f  _SECTOR_SIZE..*/
118b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
118c0 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72  SectorSize(Pager
118d0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
118e0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
118f0 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
11900 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a  r->tempFile );..
11910 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
11920 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 2f  empFile ){.    /
11930 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f  * Sector size do
11940 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72  esn't matter for
11950 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
11960 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65  . Also, the file
11970 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20  .    ** may not 
11980 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64  have been opened
11990 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63   yet, in which c
119a0 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72  ase the OsSector
119b0 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61  Size().    ** ca
119c0 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74  ll will segfault
119d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
119e0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
119f0 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
11a00 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  rSize(pPager->fd
11a10 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
11a20 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c  ger->sectorSize<
11a30 35 31 32 20 29 7b 0a 20 20 20 20 70 50 61 67 65  512 ){.    pPage
11a40 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
11a50 35 31 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  512;.  }.  if( p
11a60 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
11a70 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  e>MAX_SECTOR_SIZ
11a80 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  E ){.    assert(
11a90 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
11aa0 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 70 50 61  >=512 );.    pPa
11ab0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
11ac0 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  = MAX_SECTOR_SIZ
11ad0 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  E;.  }.}../*.** 
11ae0 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75  Playback the jou
11af0 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65  rnal and thus re
11b00 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
11b10 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68  se file to.** th
11b20 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
11b30 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72  n before we star
11b40 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  ted making chang
11b50 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es.  .**.** The 
11b60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
11b70 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  mat is as follow
11b80 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20  s: .**.**  (1)  
11b90 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20  8 byte prefix.  
11ba0 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e  A copy of aJourn
11bb0 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28  alMagic[]..**  (
11bc0 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  2)  4 byte big-e
11bd0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
11be0 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
11bf0 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20  r of valid page 
11c00 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20  records.**      
11c10 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
11c20 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
11c30 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
11c40 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  hen compute the.
11c50 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20  **       number 
11c60 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
11c70 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
11c80 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20   size..**  (3)  
11c90 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
11ca0 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
11cb0 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  is the initial v
11cc0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a  alue for the .**
11cd0 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68         sanity ch
11ce0 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20  ecksum..**  (4) 
11cf0 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
11d00 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
11d10 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
11d20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
11d30 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74        database t
11d40 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  o during a rollb
11d50 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20  ack..**  (5)  4 
11d60 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
11d70 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
11d80 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
11d90 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a  .  The header.**
11da0 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d         is this m
11db0 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a  any bytes in siz
11dc0 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79  e..**  (6)  4 by
11dd0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
11de0 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
11df0 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
11e00 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64    (7)  zero padd
11e10 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e  ing out to the n
11e20 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  ext sector size.
11e30 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f  .**  (8)  Zero o
11e40 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73  r more pages ins
11e50 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20  tances, each as 
11e60 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20  follows:.**     
11e70 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67     +  4 byte pag
11e80 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20  e number..**    
11e90 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70      +  pPager->p
11ea0 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
11eb0 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20   data..**       
11ec0 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b   +  4 byte check
11ed0 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77  sum.**.** When w
11ee0 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a  e speak of the j
11ef0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77  ournal header, w
11f00 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74  e mean the first
11f10 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a   7 items above..
11f20 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e  ** Each entry in
11f30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
11f40 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
11f50 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a  he 8th item..**.
11f60 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75  ** Call the valu
11f70 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  e from the secon
11f80 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e  d bullet "nRec".
11f90 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75    nRec is the nu
11fa0 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64  mber of.** valid
11fb0 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e   page entries in
11fc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
11fd0 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f  n most cases, yo
11fe0 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  u can compute th
11ff0 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52  e.** value of nR
12000 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ec from the size
12010 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
12020 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20  file.  But if a 
12030 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
12040 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
12050 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
12060 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69  being written, i
12070 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a  t could be the.*
12080 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  * case that the 
12090 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
120a0 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72  nal file had alr
120b0 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61  eady been increa
120c0 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65  sed but.** the e
120d0 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64  xtra entries had
120e0 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74   not yet made it
120f0 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e   safely to disk.
12100 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65    In such a case
12110 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
12120 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  f nRec computed 
12130 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
12140 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20  ze would be too 
12150 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  large.  For.** t
12160 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61  hat reason, we a
12170 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52  lways use the nR
12180 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ec value in the 
12190 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  header..**.** If
121a0 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
121b0 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74  is 0xffffffff it
121c0 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63   means that nRec
121d0 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
121e0 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ted.** from the 
121f0 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73  file size.  This
12200 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77   value is used w
12210 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c  hen the user sel
12220 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73  ects the.** no-s
12230 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74  ync option for t
12240 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70  he journal.  A p
12250 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
12260 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75  ld lead to corru
12270 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73  ption.** in this
12280 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20   case.  But for 
12290 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70  things like temp
122a0 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69  orary table (whi
122b0 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  ch will be.** de
122c0 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70  leted when the p
122d0 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
122e0 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e  ) we don't care.
122f0 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
12300 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74  file opened as t
12310 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
12320 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f  is not a well-fo
12330 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  rmed.** journal 
12340 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61  file then all pa
12350 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69  ges up to the fi
12360 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61  rst corrupted pa
12370 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a  ge are rolled.**
12380 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67   back (or no pag
12390 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  es if the journa
123a0 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72  l header is corr
123b0 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72  upted). The jour
123c0 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74  nal file.** is t
123d0 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20  hen deleted and 
123e0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
123f0 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e  ed, just as if n
12400 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64  o corruption had
12410 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  .** been encount
12420 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ered..**.** If a
12430 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  n I/O or malloc(
12440 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
12450 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  the journal-file
12460 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a   is not deleted.
12470 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
12480 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
12490 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f  ..**.** The isHo
124a0 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69  t parameter indi
124b0 63 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72  cates that we ar
124c0 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c  e trying to roll
124d0 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a  back a journal.*
124e0 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  * that might be 
124f0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  a hot journal.  
12500 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  Or, it could be 
12510 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
12520 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65   is .** preserve
12530 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55  d because of JOU
12540 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
12550 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f   or JOURNALMODE_
12560 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20  TRUNCATE..** If 
12570 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c  the journal real
12580 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74  ly is hot, reset
12590 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
125a0 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a   prior rolling.*
125b0 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65  * back any conte
125c0 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72  nt.  If the jour
125d0 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65  nal is merely pe
125e0 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73  rsistent, no res
125f0 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e  et is.** needed.
12600 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
12610 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
12620 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
12630 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74   isHot){.  sqlit
12640 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
12650 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
12660 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
12670 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
12680 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
12690 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
126a0 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20    u32 nRec;     
126b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
126c0 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
126d0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  in the journal *
126e0 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
126f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12700 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
12710 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
12720 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
12730 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
12740 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
12750 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
12760 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
12770 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
12780 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
12790 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
127a0 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  res = 1;        
127b0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
127c0 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
127d0 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20  3OsAccess() */. 
127e0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
127f0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
12800 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
12810 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20  nal file if any 
12820 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67  */.  int needPag
12830 65 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  erReset;      /*
12840 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70   True to reset p
12850 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72  age prior to fir
12860 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b  st page rollback
12870 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
12880 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
12890 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
128a0 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74   journal.  Abort
128b0 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74   early if.  ** t
128c0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d  he journal is em
128d0 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pty..  */.  asse
128e0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
128f0 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20  r->jfd) );.  rc 
12900 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
12910 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
12920 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
12930 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
12940 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74  zJ==0 ){.    got
12950 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
12960 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
12970 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
12980 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  l name from the 
12990 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
129a0 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20  s present..  ** 
129b0 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
129c0 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
129d0 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20   specified, but 
129e0 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a  the file is not.
129f0 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20    ** present on 
12a00 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a  disk, then the j
12a10 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f  ournal is not ho
12a20 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e  t and does not n
12a30 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70  eed to be.  ** p
12a40 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a  layed back..  **
12a50 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68  .  ** TODO: Tech
12a60 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c  nically the foll
12a70 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f  owing is an erro
12a80 72 20 62 65 63 61 75 73 65 20 69 74 20 61 73 73  r because it ass
12a90 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62  umes that.  ** b
12aa0 75 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70  uffer Pager.pTmp
12ab0 53 70 61 63 65 20 69 73 20 28 6d 78 50 61 74 68  Space is (mxPath
12ac0 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72  name+1) bytes or
12ad0 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68   larger. i.e. th
12ae0 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d  at.  ** (pPager-
12af0 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61  >pageSize >= pPa
12b00 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
12b10 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20  hname+1). Using 
12b20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20  os_unix.c,.  ** 
12b30 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35   mxPathname is 5
12b40 31 32 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  12, which is the
12b50 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e   same as the min
12b60 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76  imum allowable v
12b70 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61  alue.  ** for pa
12b80 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a  geSize..  */.  z
12b90 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
12ba0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63  >pTmpSpace;.  rc
12bb0 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
12bc0 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
12bd0 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
12be0 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
12bf0 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63  ame+1);.  if( rc
12c00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
12c10 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20  Master[0] ){.   
12c20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
12c30 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73  ccess(pVfs, zMas
12c40 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ter, SQLITE_ACCE
12c50 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29  SS_EXISTS, &res)
12c60 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20  ;.  }.  zMaster 
12c70 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  = 0;.  if( rc!=S
12c80 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73  QLITE_OK || !res
12c90 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
12ca0 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
12cb0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
12cc0 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50  Off = 0;.  needP
12cd0 61 67 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f  agerReset = isHo
12ce0 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  t;..  /* This lo
12cf0 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69  op terminates ei
12d00 74 68 65 72 20 77 68 65 6e 20 61 20 72 65 61 64  ther when a read
12d10 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20  JournalHdr() or 
12d20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79  .  ** pager_play
12d30 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20  back_one_page() 
12d40 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c  call returns SQL
12d50 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49  ITE_DONE or an I
12d60 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63  O error .  ** oc
12d70 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68  curs. .  */.  wh
12d80 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 6e  ile( 1 ){.    in
12d90 74 20 69 73 55 6e 73 79 6e 63 20 3d 20 30 3b 0a  t isUnsync = 0;.
12da0 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
12db0 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
12dc0 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ader from the jo
12dd0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20  urnal file.  If 
12de0 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a  there are.    **
12df0 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65   not enough byte
12e00 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f  s left in the jo
12e10 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61  urnal file for a
12e20 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72   complete header
12e30 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69  , or.    ** it i
12e40 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65  s corrupted, the
12e50 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74  n a process must
12e60 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65   of failed while
12e70 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20   writing it..   
12e80 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74   ** This indicat
12e90 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20  es nothing more 
12ea0 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c  needs to be roll
12eb0 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a  ed back..    */.
12ec0 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
12ed0 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
12ee0 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65  isHot, szJ, &nRe
12ef0 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69  c, &mxPg);.    i
12f00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12f10 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72   ){ .      if( r
12f20 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
12f30 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
12f40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
12f50 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  }.      goto end
12f60 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
12f70 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
12f80 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
12f90 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61  then this journa
12fa0 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79  l was created by
12fb0 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a   a process.    *
12fc0 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d  * working in no-
12fd0 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20  sync mode. This 
12fe0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72  means that the r
12ff0 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  est of the journ
13000 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63  al.    ** file c
13010 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73  onsists of pages
13020 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  , there are no m
13030 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ore journal head
13040 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20  ers. Compute.   
13050 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
13060 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74   nRec based on t
13070 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a  his assumption..
13080 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
13090 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20  Rec==0xffffffff 
130a0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
130b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
130c0 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
130d0 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
130e0 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74       nRec = (int
130f0 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c  )((szJ - JOURNAL
13100 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29  _HDR_SZ(pPager))
13110 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70  /JOURNAL_PG_SZ(p
13120 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a  Pager));.    }..
13130 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
13140 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c  s 0 and this rol
13150 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72  lback is of a tr
13160 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65  ansaction create
13170 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a  d by this.    **
13180 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20   process and if 
13190 74 68 69 73 20 69 73 20 74 68 65 20 66 69 6e 61  this is the fina
131a0 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20  l header in the 
131b0 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74  journal, then it
131c0 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68   means.    ** th
131d0 61 74 20 74 68 69 73 20 70 61 72 74 20 6f 66 20  at this part of 
131e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
131f0 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74  being filled but
13200 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
13210 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20  n.    ** synced 
13220 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74  to disk.  Comput
13230 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
13240 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74  pages based on t
13250 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20  he remaining.   
13260 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20   ** size of the 
13270 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
13280 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74 65   ** The third te
13290 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20 77  rm of the test w
132a0 61 73 20 61 64 64 65 64 20 74 6f 20 66 69 78 20  as added to fix 
132b0 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20  ticket #2565..  
132c0 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e    ** When rollin
132d0 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75  g back a hot jou
132e0 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c  rnal, nRec==0 al
132f0 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61 74 20  ways means that 
13300 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20  the next.    ** 
13310 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75  chunk of the jou
13320 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65  rnal contains ze
13330 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20 72  ro pages to be r
13340 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75 74  olled back.  But
13350 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69  .    ** when doi
13360 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e  ng a ROLLBACK an
13370 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63 68  d the nRec==0 ch
13380 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74 20  unk is the last 
13390 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20  chunk in.    ** 
133a0 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  the journal, it 
133b0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6a  means that the j
133c0 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e  ournal might con
133d0 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a  tain additional.
133e0 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74 68 61      ** pages tha
133f0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 6f 6c  t need to be rol
13400 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68 61  led back and tha
13410 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
13420 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 68  pages .    ** sh
13430 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
13440 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f   based on the jo
13450 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e  urnal file size.
13460 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
13470 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f  nRec==0 && !isHo
13480 74 20 26 26 0a 20 20 20 20 20 20 20 20 70 50 61  t &&.        pPa
13490 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b  ger->journalHdr+
134a0 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
134b0 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e  Pager)==pPager->
134c0 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20  journalOff ){.  
134d0 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29      nRec = (int)
134e0 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e  ((szJ - pPager->
134f0 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f  journalOff) / JO
13500 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
13510 65 72 29 29 3b 0a 20 20 20 20 20 20 69 73 55 6e  er));.      isUn
13520 73 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  sync = 1;.    }.
13530 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
13540 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61  is the first hea
13550 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68  der read from th
13560 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63  e journal, trunc
13570 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ate the.    ** d
13580 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63  atabase file bac
13590 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
135a0 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  l size..    */. 
135b0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
135c0 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
135d0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
135e0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
135f0 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
13600 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20  Pager, mxPg);.  
13610 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
13620 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
13630 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
13640 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ck;.      }.    
13650 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
13660 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a   = mxPg;.    }..
13670 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67      /* Copy orig
13680 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
13690 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  f the journal an
136a0 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
136b0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
136c0 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67   file and/or pag
136d0 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a  e cache..    */.
136e0 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e      for(u=0; u<n
136f0 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20  Rec; u++){.     
13700 20 69 66 28 20 6e 65 65 64 50 61 67 65 72 52 65   if( needPagerRe
13710 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  set ){.        p
13720 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
13730 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64  r);.        need
13740 50 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a  PagerReset = 0;.
13750 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
13760 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
13770 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
13780 72 2c 31 2c 69 73 55 6e 73 79 6e 63 2c 26 70 50  r,1,isUnsync,&pP
13790 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
137a0 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ,0,0);.      if(
137b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
137c0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  {.        if( rc
137d0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
137e0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
137f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
13800 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
13810 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
13820 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
13830 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
13840 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
13850 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
13860 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61  rollback, quit a
13870 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  nd return the er
13880 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ror.          **
13890 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c   code.  This wil
138a0 6c 20 63 61 75 73 65 20 74 68 65 20 70 61 67 65  l cause the page
138b0 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65  r to enter the e
138c0 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20  rror state.     
138d0 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20       ** so that 
138e0 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d 20  no further harm 
138f0 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50  will be done.  P
13900 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a  erhaps the next.
13910 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
13920 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f  cess to come alo
13930 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20  ng will be able 
13940 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
13950 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
13960 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
13970 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
13980 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
13990 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
139a0 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f    /*NOTREACHED*/
139b0 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a  .  assert( 0 );.
139c0 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  .end_playback:. 
139d0 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20   /* Following a 
139e0 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61  rollback, the da
139f0 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75  tabase file shou
13a00 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74  ld be back in it
13a10 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  s original.  ** 
13a20 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74  state prior to t
13a30 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
13a40 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20  transaction, so 
13a50 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20  invoke the.  ** 
13a60 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
13a70 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63  UNCHANGED file-c
13a80 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f  ontrol method to
13a90 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a   disable the.  *
13aa0 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74  * assertion that
13ab0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
13ac0 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64   counter was mod
13ad0 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  ified..  */.  as
13ae0 73 65 72 74 28 0a 20 20 20 20 70 50 61 67 65 72  sert(.    pPager
13af0 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d  ->fd->pMethods==
13b00 30 20 7c 7c 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ||.    sqlite3
13b10 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50  OsFileControl(pP
13b20 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f  ager->fd,SQLITE_
13b30 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
13b40 45 44 2c 30 29 3e 3d 53 51 4c 49 54 45 5f 4f 4b  ED,0)>=SQLITE_OK
13b50 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  .  );..  /* If t
13b60 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20  his playback is 
13b70 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61  happening automa
13b80 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73  tically as a res
13b90 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20  ult of an IO or 
13ba0 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72  .  ** malloc err
13bb0 6f 72 20 74 68 61 74 20 6f 63 63 75 72 72 65 64  or that occurred
13bc0 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67   after the chang
13bd0 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70  e-counter was up
13be0 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20  dated but .  ** 
13bf0 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
13c00 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69  action was commi
13c10 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63  tted, then the c
13c20 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20  hange-counter . 
13c30 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e   ** modification
13c40 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20 62   may just have b
13c50 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66  een reverted. If
13c60 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   this happens in
13c70 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a   exclusive .  **
13c80 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73   mode, then subs
13c90 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69  equent transacti
13ca0 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79  ons performed by
13cb0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
13cc0 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70  will not.  ** up
13cd0 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d  date the change-
13ce0 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20  counter at all. 
13cf0 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f  This may lead to
13d00 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74   cache inconsist
13d10 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65  ency.  ** proble
13d20 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f  ms for other pro
13d30 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70  cesses at some p
13d40 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
13d50 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a  re. So, just.  *
13d60 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 68  * in case this h
13d70 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65  as happened, cle
13d80 61 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75  ar the changeCou
13d90 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e  ntDone flag now.
13da0 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
13db0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
13dc0 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
13dd0 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  le;..  if( rc==S
13de0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13df0 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72  zMaster = pPager
13e00 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
13e10 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
13e20 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
13e30 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
13e40 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
13e50 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74  thname+1);.    t
13e60 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
13e70 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20  ITE_OK );.  }.  
13e80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13e90 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
13ea0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
13eb0 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  ion(pPager, zMas
13ec0 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a 20  ter[0]!='\0');. 
13ed0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
13ee0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
13ef0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
13f00 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72  TE_OK && zMaster
13f10 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20 20  [0] && res ){.  
13f20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61    /* If there wa
13f30 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
13f40 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74  al and this rout
13f50 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
13f60 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20  success,.    ** 
13f70 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73  see if it is pos
13f80 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
13f90 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
13fa0 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  al..    */.    r
13fb0 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  c = pager_delmas
13fc0 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  ter(pPager, zMas
13fd0 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ter);.    testca
13fe0 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
13ff0 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  K );.  }..  /* T
14000 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  he Pager.sectorS
14010 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79  ize variable may
14020 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74   have been updat
14030 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67  ed while rolling
14040 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75  .  ** back a jou
14050 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20  rnal created by 
14060 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61  a process with a
14070 20 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f   different secto
14080 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75  r size.  ** valu
14090 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74  e. Reset it to t
140a0 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65  he correct value
140b0 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73   for this proces
140c0 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63  s..  */.  setSec
140d0 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
140e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
140f0 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
14100 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65 70  savepoint pSavep
14110 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 61  oint. Or, if pSa
14120 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74  vepoint==NULL, t
14130 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20  hen playback.** 
14140 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
14150 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
14160 54 68 65 20 63 61 73 65 20 70 53 61 76 65 70 6f  The case pSavepo
14170 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73  int==NULL occurs
14180 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c   when .** a ROLL
14190 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20  BACK TO command 
141a0 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20  is invoked on a 
141b0 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20 69  SAVEPOINT that i
141c0 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
141d0 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a  .** savepoint..*
141e0 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65 70  *.** When pSavep
141f0 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  oint is not NULL
14200 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d   (meaning a non-
14210 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
14220 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69  point is .** bei
14230 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c  ng rolled back),
14240 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   then the rollba
14250 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 75  ck consists of u
14260 70 20 74 6f 20 74 68 72 65 65 20 73 74 61 67 65  p to three stage
14270 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20  s,.** performed 
14280 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70 65  in the order spe
14290 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  cified:.**.**   
142a0 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c 61 79  * Pages are play
142b0 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
142c0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
142d0 61 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a 2a  arting at byte.*
142e0 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50 61 67  *     offset Pag
142f0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66  erSavepoint.iOff
14300 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  set and continui
14310 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61  ng to .**     Pa
14320 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
14330 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20 74  rOffset, or to t
14340 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
14350 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  in journal.**   
14360 20 20 66 69 6c 65 20 69 66 20 50 61 67 65 72 53    file if PagerS
14370 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
14380 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a  set is zero..**.
14390 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72 53  **   * If PagerS
143a0 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
143b0 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c  set is not zero,
143c0 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20   then pages are 
143d0 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62 61  played.**     ba
143e0 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d  ck starting from
143f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
14400 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  der immediately 
14410 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20  following .**   
14420 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
14430 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20 74  .iHdrOffset to t
14440 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
14450 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  in journal file.
14460 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
14470 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65 64   are then played
14480 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 73   back from the s
14490 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ub-journal file,
144a0 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20   starting.**    
144b0 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 53   with the PagerS
144c0 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65 63  avepoint.iSubRec
144d0 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
144e0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a  to the end of.**
144f0 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c       the journal
14500 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72   file..**.** Thr
14510 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c  oughout the roll
14520 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65 61  back process, ea
14530 63 68 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  ch time a page i
14540 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74  s rolled back, t
14550 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
14560 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69  ing bit is set i
14570 6e 20 61 20 62 69 74 76 65 63 20 73 74 72 75 63  n a bitvec struc
14580 74 75 72 65 20 28 76 61 72 69 61 62 6c 65 20 70  ture (variable p
14590 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69  Done in the.** i
145a0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65  mplementation be
145b0 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75 73  low). This is us
145c0 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ed to ensure tha
145d0 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c 79  t a page is only
145e0 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
145f0 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
14600 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  t is encountered
14610 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72 6e   in either journ
14620 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61  al..**.** If pSa
14630 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c  vepoint is NULL,
14640 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20   then pages are 
14650 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63 6b  only played back
14660 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a   from the main.*
14670 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
14680 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
14690 20 66 6f 72 20 61 20 62 69 74 76 65 63 20 69 6e   for a bitvec in
146a0 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
146b0 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  * In either case
146c0 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63  , before playbac
146d0 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20  k commences the 
146e0 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72  Pager.dbSize var
146f0 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65  iable.** is rese
14700 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74  t to the value t
14710 68 61 74 20 69 74 20 68 65 6c 64 20 61 74 20 74  hat it held at t
14720 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
14730 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f  savepoint .** (o
14740 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20  r transaction). 
14750 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61 20 70  No page with a p
14760 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 74  age-number great
14770 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c  er than this val
14780 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64 20  ue.** is played 
14790 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20  back. If one is 
147a0 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69  encountered it i
147b0 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65 64  s simply skipped
147c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
147d0 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76  pagerPlaybackSav
147e0 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50  epoint(Pager *pP
147f0 61 67 65 72 2c 20 50 61 67 65 72 53 61 76 65 70  ager, PagerSavep
14800 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74  oint *pSavepoint
14810 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  ){.  i64 szJ;   
14820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14830 20 45 66 66 65 63 74 69 76 65 20 73 69 7a 65 20   Effective size 
14840 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
14850 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
14860 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  rOff;           
14870 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73    /* End of firs
14880 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69  t segment of mai
14890 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  n-journal record
148a0 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  s */.  int rc = 
148b0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
148c0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
148d0 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
148e0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
148f0 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65  Bitvec to ensure
14900 20 70 61 67 65 73 20 70 6c 61 79 65 64 20 62 61   pages played ba
14910 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a  ck only once */.
14920 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
14930 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
14940 53 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a 20  SHARED );..  /* 
14950 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76 65  Allocate a bitve
14960 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f 72  c to use to stor
14970 65 20 74 68 65 20 73 65 74 20 6f 66 20 70 61 67  e the set of pag
14980 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a  es rolled back *
14990 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
149a0 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20  nt ){.    pDone 
149b0 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
149c0 72 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e 74  reate(pSavepoint
149d0 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69 66  ->nOrig);.    if
149e0 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20  ( !pDone ){.    
149f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14a00 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
14a10 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64  ..  /* Set the d
14a20 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 61 63  atabase size bac
14a30 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  k to the value i
14a40 74 20 77 61 73 20 62 65 66 6f 72 65 20 74 68 65  t was before the
14a50 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a   savepoint .  **
14a60 20 62 65 69 6e 67 20 72 65 76 65 72 74 65 64 20   being reverted 
14a70 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f  was opened..  */
14a80 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
14a90 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f  e = pSavepoint ?
14aa0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72   pSavepoint->nOr
14ab0 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f  ig : pPager->dbO
14ac0 72 69 67 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 55  rigSize;..  /* U
14ad0 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  se pPager->journ
14ae0 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66 66  alOff as the eff
14af0 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74  ective size of t
14b00 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
14b10 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20  .  ** journal.  
14b20 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20  The actual file 
14b30 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20  might be larger 
14b40 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a  than this in.  *
14b50 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  * PAGER_JOURNALM
14b60 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20  ODE_TRUNCATE or 
14b70 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
14b80 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74 20  E_PERSIST.  But 
14b90 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61  anything.  ** pa
14ba0 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  st pPager->journ
14bb0 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d  alOff is off-lim
14bc0 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a  its to us..  */.
14bd0 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e    szJ = pPager->
14be0 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f  journalOff;..  /
14bf0 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69  * Begin by rolli
14c00 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20  ng back records 
14c10 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
14c20 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
14c30 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65  t.  ** PagerSave
14c40 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e  point.iOffset an
14c50 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
14c60 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
14c70 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68   header..  ** Th
14c80 65 72 65 20 6d 69 67 68 74 20 62 65 20 72 65 63  ere might be rec
14c90 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  ords in the main
14ca0 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61   journal that ha
14cb0 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  ve a page number
14cc0 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68  .  ** greater th
14cd0 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  an the current d
14ce0 61 74 61 62 61 73 65 20 73 69 7a 65 20 28 70 50  atabase size (pP
14cf0 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75  ager->dbSize) bu
14d00 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c  t those.  ** wil
14d10 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61 75 74  l be skipped aut
14d20 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67  omatically.  Pag
14d30 65 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  es are added to 
14d40 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20  pDone as they.  
14d50 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62 61  ** are played ba
14d60 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ck..  */.  if( p
14d70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
14d80 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65   iHdrOff = pSave
14d90 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65  point->iHdrOffse
14da0 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t ? pSavepoint->
14db0 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a  iHdrOffset : szJ
14dc0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
14dd0 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65  urnalOff = pSave
14de0 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a  point->iOffset;.
14df0 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
14e00 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
14e10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69  er->journalOff<i
14e20 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  HdrOff ){.      
14e30 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
14e40 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
14e50 67 65 72 2c 20 31 2c 20 30 2c 20 26 70 50 61 67  ger, 1, 0, &pPag
14e60 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
14e70 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20 20 7d  1, pDone);.    }
14e80 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
14e90 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
14ea0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
14eb0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
14ec0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  = 0;.  }..  /* C
14ed0 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20  ontinue rolling 
14ee0 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74  back records out
14ef0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
14f00 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74  rnal starting at
14f10 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
14f20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
14f30 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  een and continui
14f40 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66  ng until the eff
14f50 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20  ective end.  ** 
14f60 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
14f70 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69  nal file.  Conti
14f80 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d  nue to skip out-
14f90 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61  of-range pages a
14fa0 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65  nd.  ** continue
14fb0 20 61 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f   adding pages ro
14fc0 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f  lled back to pDo
14fd0 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  ne..  */.  while
14fe0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
14ff0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
15000 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20  alOff<szJ ){.   
15010 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20   u32 ii;        
15020 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
15030 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e  ter */.    u32 n
15040 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a  JRec = 0;     /*
15050 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e   Number of Journ
15060 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al Records */.  
15070 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20    u32 dummy;.   
15080 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
15090 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c 20  lHdr(pPager, 0, 
150a0 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75  szJ, &nJRec, &du
150b0 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74  mmy);.    assert
150c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
150d0 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  E );..    /*.   
150e0 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d   ** The "pPager-
150f0 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
15100 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
15110 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
15120 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74  nalOff".    ** t
15130 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20 74  est is related t
15140 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20  o ticket #2565. 
15150 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73 73   See the discuss
15160 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a  ion in the.    *
15170 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  * pager_playback
15180 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  () function for 
15190 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
151a0 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mation..    */. 
151b0 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20     if( nJRec==0 
151c0 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d  .     && pPager-
151d0 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
151e0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
151f0 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
15200 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20  nalOff.    ){.  
15210 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32      nJRec = (u32
15220 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  )((szJ - pPager-
15230 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55  >journalOff)/JOU
15240 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
15250 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  r));.    }.    f
15260 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  or(ii=0; rc==SQL
15270 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52  ITE_OK && ii<nJR
15280 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  ec && pPager->jo
15290 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69  urnalOff<szJ; ii
152a0 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ++){.      rc = 
152b0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
152c0 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
152d0 31 2c 20 30 2c 20 26 70 50 61 67 65 72 2d 3e 6a  1, 0, &pPager->j
152e0 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 2c 20 70 44  ournalOff, 1, pD
152f0 6f 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  one);.    }.    
15300 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
15310 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20  TE_DONE );.  }. 
15320 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
15330 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
15340 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 73 7a  ->journalOff==sz
15350 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c  J );..  /* Final
15360 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61  ly,  rollback pa
15370 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ges from the sub
15380 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20  -journal.  Page 
15390 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70  that were.  ** p
153a0 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64  reviously rolled
153b0 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65   back out of the
153c0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61   main journal (a
153d0 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20  nd are hence in 
153e0 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c  pDone).  ** will
153f0 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75   be skipped.  Ou
15400 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73  t-of-range pages
15410 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65   are also skippe
15420 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  d..  */.  if( pS
15430 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
15440 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20  u32 ii;         
15450 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
15460 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66  er */.    i64 of
15470 66 73 65 74 20 3d 20 70 53 61 76 65 70 6f 69 6e  fset = pSavepoin
15480 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50  t->iSubRec*(4+pP
15490 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
154a0 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76  .    for(ii=pSav
154b0 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b  epoint->iSubRec;
154c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
154d0 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75  & ii<pPager->nSu
154e0 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  bRec; ii++){.   
154f0 20 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65     assert( offse
15500 74 3d 3d 69 69 2a 28 34 2b 70 50 61 67 65 72 2d  t==ii*(4+pPager-
15510 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a 20 20  >pageSize) );.  
15520 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
15530 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
15540 28 70 50 61 67 65 72 2c 20 30 2c 20 30 2c 20 26  (pPager, 0, 0, &
15550 6f 66 66 73 65 74 2c 20 31 2c 20 70 44 6f 6e 65  offset, 1, pDone
15560 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
15570 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
15580 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73  DONE );.  }..  s
15590 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
155a0 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66  roy(pDone);.  if
155b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
155c0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
155d0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
155e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
155f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
15600 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
15610 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
15620 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  y pages that are
15630 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69   allowed..*/.voi
15640 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
15650 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72  tCachesize(Pager
15660 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
15670 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Page){.  sqlite3
15680 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73 69  PcacheSetCachesi
15690 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
156a0 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a  he, mxPage);.}..
156b0 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65  /*.** Adjust the
156c0 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74   robustness of t
156d0 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64  he database to d
156e0 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
156f0 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f  crashes.** or po
15700 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20  wer failures by 
15710 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d  changing the num
15720 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20  ber of syncs()s 
15730 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20  when writing.** 
15740 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
15750 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65  rnal.  There are
15760 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a   three levels:.*
15770 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20  *.**    OFF     
15780 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28    sqlite3OsSync(
15790 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  ) is never calle
157a0 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
157b0 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20  default.**      
157c0 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70          for temp
157d0 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69  orary and transi
157e0 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ent files..**.**
157f0 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68      NORMAL    Th
15800 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
15810 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20  ced once before 
15820 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
15830 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
15840 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54      database.  T
15850 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  his is normally 
15860 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74  adequate protect
15870 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20  ion, but.**     
15880 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74           it is t
15890 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73  heoretically pos
158a0 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65  sible, though ve
158b0 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20  ry unlikely,.** 
158c0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61               tha
158d0 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20  t an inopertune 
158e0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
158f0 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f  uld leave the jo
15900 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  urnal.**        
15910 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65        in a state
15920 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75   which would cau
15930 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65  se damage to the
15940 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
15950 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69            when i
15960 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t is rolled back
15970 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20  ..**.**    FULL 
15980 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c       The journal
15990 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65   is synced twice
159a0 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
159b0 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
159c0 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
159d0 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20  base (with some 
159e0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
159f0 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65  mation - the nRe
15a00 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20  c field.**      
15a10 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a          of the j
15a20 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20  ournal header - 
15a30 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e  being written in
15a40 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f   between the two
15a50 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
15a60 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20   syncs).  If we 
15a70 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74  assume that writ
15a80 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  ing a.**        
15a90 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73        single dis
15aa0 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d  k sector is atom
15ab0 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f  ic, then this mo
15ac0 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20  de provides.**  
15ad0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75              assu
15ae0 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a  rance that the j
15af0 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20  ournal will not 
15b00 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20  be corrupted to 
15b10 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
15b20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75      point of cau
15b30 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74  sing damage to t
15b40 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69  he database duri
15b50 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  ng rollback..**.
15b60 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65  ** Numeric value
15b70 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
15b80 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61  h these states a
15b90 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41  re OFF==1, NORMA
15ba0 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c  L=2,.** and FULL
15bb0 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  =3..*/.#ifndef S
15bc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
15bd0 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71  _PRAGMAS.void sq
15be0 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66  lite3PagerSetSaf
15bf0 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20 2a  etyLevel(Pager *
15c00 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65  pPager, int leve
15c10 6c 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73 79 6e  l, int bFullFsyn
15c20 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  c){.  pPager->no
15c30 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d  Sync =  (level==
15c40 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  1 || pPager->tem
15c50 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70  pFile) ?1:0;.  p
15c60 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
15c70 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21  = (level==3 && !
15c80 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
15c90 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72  ) ?1:0;.  pPager
15ca0 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 28  ->sync_flags = (
15cb0 62 46 75 6c 6c 46 73 79 6e 63 3f 53 51 4c 49 54  bFullFsync?SQLIT
15cc0 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49  E_SYNC_FULL:SQLI
15cd0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b  TE_SYNC_NORMAL);
15ce0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
15cf0 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e  oSync ) pPager->
15d00 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a  needSync = 0;.}.
15d10 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
15d20 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
15d30 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
15d40 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65  ncremented whene
15d50 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a  ver the library.
15d60 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f  ** attempts to o
15d70 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
15d80 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f  file.  This info
15d90 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
15da0 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
15db0 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
15dc0 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  .  .*/.#ifdef SQ
15dd0 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
15de0 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
15df0 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
15e00 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74  ../*.** Open a t
15e10 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a  emporary file..*
15e20 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66  *.** Write the f
15e30 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
15e40 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75  nto *pFile. Retu
15e50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
15e60 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73  success .** or s
15e70 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
15e80 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e  code if we fail.
15e90 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74   The OS will aut
15ea0 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64  omatically .** d
15eb0 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72  elete the tempor
15ec0 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74  ary file when it
15ed0 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
15ee0 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 73 73  * The flags pass
15ef0 65 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61  ed to the VFS la
15f00 79 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c  yer xOpen() call
15f10 20 61 72 65 20 74 68 6f 73 65 20 73 70 65 63 69   are those speci
15f20 66 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d  fied.** by param
15f30 65 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52  eter vfsFlags OR
15f40 65 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  ed with the foll
15f50 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
15f60 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
15f70 44 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51  DWRITE.**     SQ
15f80 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
15f90 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
15fa0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a  PEN_EXCLUSIVE.**
15fb0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
15fc0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a  _DELETEONCLOSE.*
15fd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
15fe0 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61  erOpentemp(.  Pa
15ff0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
16000 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
16010 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c   object */.  sql
16020 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
16030 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  ,  /* Write the 
16040 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
16050 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  here */.  int vf
16060 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
16070 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
16080 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56  through to the V
16090 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  FS */.){.  int r
160a0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
160b0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
160c0 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
160d0 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33  E_TEST.  sqlite3
160e0 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b  _opentemp_count+
160f0 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20  +;  /* Used for 
16100 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
16110 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e  ysis only */.#en
16120 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20  dif..  vfsFlags 
16130 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  |=  SQLITE_OPEN_
16140 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
16150 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
16160 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c  .            SQL
16170 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
16180 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  VE | SQLITE_OPEN
16190 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a  _DELETEONCLOSE;.
161a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
161b0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66  Open(pPager->pVf
161c0 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73  s, 0, pFile, vfs
161d0 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73  Flags, 0);.  ass
161e0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
161f0 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69  OK || isOpen(pFi
16200 6c 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  le) );.  return 
16210 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rc;.}../*.** Set
16220 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
16230 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  r function..**.*
16240 2a 20 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f  * The pager invo
16250 6b 65 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e  kes the busy-han
16260 64 6c 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f  dler if sqlite3O
16270 73 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20  sLock() returns 
16280 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
16290 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75  when trying to u
162a0 70 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c  pgrade from no-l
162b0 6f 63 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20  ock to a SHARED 
162c0 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e  lock,.** or when
162d0 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61   trying to upgra
162e0 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56  de from a RESERV
162f0 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58  ED lock to an EX
16300 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b  CLUSIVE .** lock
16310 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20  . It does *not* 
16320 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
16330 68 61 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67  handler when upg
16340 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53  rading from.** S
16350 48 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45  HARED to RESERVE
16360 44 2c 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61  D, or when upgra
16370 64 69 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44  ding from SHARED
16380 20 74 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   to EXCLUSIVE.**
16390 20 28 77 68 69 63 68 20 6f 63 63 75 72 73 20 64   (which occurs d
163a0 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61  uring hot-journa
163b0 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d  l rollback). Sum
163c0 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72  mary:.**.**   Tr
163d0 61 6e 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20  ansition        
163e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163f0 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48  | Invokes xBusyH
16400 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d  andler.**   ----
16410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16440 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43  ----.**   NO_LOC
16450 4b 20 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45  K       -> SHARE
16460 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65  D_LOCK      | Ye
16470 73 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f  s.**   SHARED_LO
16480 43 4b 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44  CK   -> RESERVED
16490 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a  _LOCK    | No.**
164a0 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20     SHARED_LOCK  
164b0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   -> EXCLUSIVE_LO
164c0 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52  CK   | No.**   R
164d0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20  ESERVED_LOCK -> 
164e0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20  EXCLUSIVE_LOCK  
164f0 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20   | Yes.**.** If 
16500 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
16510 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e   callback return
16520 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20  s non-zero, the 
16530 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72  lock is .** retr
16540 69 65 64 2e 20 49 66 20 69 74 20 72 65 74 75 72  ied. If it retur
16550 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  ns zero, then th
16560 65 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72  e SQLITE_BUSY er
16570 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ror is.** return
16580 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
16590 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 41 50   of the pager AP
165a0 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  I function..*/.v
165b0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
165c0 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 0a  SetBusyhandler(.
165d0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
165e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165f0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
16600 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
16610 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28  (*xBusyHandler)(
16620 76 6f 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20  void *),        
16630 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
16640 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy-handler func
16650 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  tion */.  void *
16660 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
16670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16680 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61  * Argument to pa
16690 73 73 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c  ss to xBusyHandl
166a0 65 72 20 2a 2f 0a 29 7b 20 20 0a 20 20 70 50 61  er */.){  .  pPa
166b0 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
166c0 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65 72  r = xBusyHandler
166d0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73  ;.  pPager->pBus
166e0 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70 42  yHandlerArg = pB
166f0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a 7d  usyHandlerArg;.}
16700 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74  ../*.** Report t
16710 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
16720 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72 20  size and number 
16730 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65  of reserved byte
16740 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65  s back.** to the
16750 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65   codec..*/.#ifde
16760 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
16770 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  EC.static void p
16780 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 50  agerReportSize(P
16790 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
167a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f   if( pPager->xCo
167b0 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20  decSizeChng ){. 
167c0 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65     pPager->xCode
167d0 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67 65 72  cSizeChng(pPager
167e0 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67 65 72  ->pCodec, pPager
167f0 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
16800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16810 20 20 20 20 20 20 20 28 69 6e 74 29 70 50 61 67         (int)pPag
16820 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20  er->nReserve);. 
16830 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
16840 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72 74 53  ine pagerReportS
16850 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f  ize(X)     /* No
16860 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e 6f 74  -op if we do not
16870 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64 65 63   support a codec
16880 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   */.#endif../*.*
16890 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67  * Change the pag
168a0 65 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  e size used by t
168b0 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e  he Pager object.
168c0 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   The new page si
168d0 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64  ze .** is passed
168e0 20 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a   in *pPageSize..
168f0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
16900 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  er is in the err
16910 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  or state when th
16920 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
16930 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20  alled, it.** is 
16940 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c  a no-op. The val
16950 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
16960 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65  he error state e
16970 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20  rror code (i.e. 
16980 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54  .** one of SQLIT
16990 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f  E_IOERR, SQLITE_
169a0 43 4f 52 52 55 50 54 20 6f 72 20 53 51 4c 49 54  CORRUPT or SQLIT
169b0 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f  E_FULL)..**.** O
169c0 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c  therwise, if all
169d0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
169e0 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
169f0 2a 20 20 20 2a 20 74 68 65 20 6e 65 77 20 70 61  *   * the new pa
16a00 67 65 20 73 69 7a 65 20 28 76 61 6c 75 65 20 6f  ge size (value o
16a10 66 20 2a 70 50 61 67 65 53 69 7a 65 29 20 69 73  f *pPageSize) is
16a20 20 76 61 6c 69 64 20 28 61 20 70 6f 77 65 72 20   valid (a power 
16a30 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f 20 62  .**     of two b
16a40 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 53  etween 512 and S
16a50 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
16a60 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c  IZE, inclusive),
16a70 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74   and.**.**   * t
16a80 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
16a90 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66  tanding page ref
16aa0 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a  erences, and.**.
16ab0 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62  **   * the datab
16ac0 61 73 65 20 69 73 20 65 69 74 68 65 72 20 6e 6f  ase is either no
16ad0 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  t an in-memory d
16ae0 61 74 61 62 61 73 65 20 6f 72 20 69 74 20 69 73  atabase or it is
16af0 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65  .**     an in-me
16b00 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 74 68  mory database th
16b10 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  at currently con
16b20 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 70 61  sists of zero pa
16b30 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20  ges..**.** then 
16b40 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
16b50 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73 65   page size is se
16b60 74 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e  t to *pPageSize.
16b70 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
16b80 67 65 20 73 69 7a 65 20 69 73 20 63 68 61 6e 67  ge size is chang
16b90 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  ed, then this fu
16ba0 6e 63 74 69 6f 6e 20 75 73 65 73 20 73 71 6c 69  nction uses sqli
16bb0 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29  te3PagerMalloc()
16bc0 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61   .** to obtain a
16bd0 20 6e 65 77 20 50 61 67 65 72 2e 70 54 6d 70 53   new Pager.pTmpS
16be0 70 61 63 65 20 62 75 66 66 65 72 2e 20 49 66 20  pace buffer. If 
16bf0 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  this allocation 
16c00 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c  attempt .** fail
16c10 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  s, SQLITE_NOMEM 
16c20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
16c30 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 72 65  the page size re
16c40 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e  mains unchanged.
16c50 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65   .** In all othe
16c60 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54 45 5f  r cases, SQLITE_
16c70 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
16c80 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
16c90 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 63 68  e size is not ch
16ca0 61 6e 67 65 64 2c 20 65 69 74 68 65 72 20 62 65  anged, either be
16cb0 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 65  cause one of the
16cc0 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63   enumerated.** c
16cd0 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20  onditions above 
16ce0 69 73 20 6e 6f 74 20 74 72 75 65 2c 20 74 68 65  is not true, the
16cf0 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 72   pager was in er
16d00 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74  ror state when t
16d10 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
16d20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62  was called, or b
16d30 65 63 61 75 73 65 20 74 68 65 20 6d 65 6d 6f 72  ecause the memor
16d40 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74  y allocation att
16d50 65 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a  empt failed, .**
16d60 20 74 68 65 6e 20 2a 70 50 61 67 65 53 69 7a 65   then *pPageSize
16d70 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
16d80 6c 64 2c 20 72 65 74 61 69 6e 65 64 20 70 61 67  ld, retained pag
16d90 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 72 65  e size before re
16da0 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  turning..*/.int 
16db0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
16dc0 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  agesize(Pager *p
16dd0 50 61 67 65 72 2c 20 75 31 36 20 2a 70 50 61 67  Pager, u16 *pPag
16de0 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
16df0 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  rve){.  int rc =
16e00 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
16e10 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
16e20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 31  ITE_OK ){.    u1
16e30 36 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50  6 pageSize = *pP
16e40 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73  ageSize;.    ass
16e50 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30  ert( pageSize==0
16e60 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35   || (pageSize>=5
16e70 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
16e80 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
16e90 53 49 5a 45 29 20 29 3b 0a 20 20 20 20 69 66 28  SIZE) );.    if(
16ea0 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d   (pPager->memDb=
16eb0 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  =0 || pPager->db
16ec0 53 69 7a 65 3d 3d 30 29 0a 20 20 20 20 20 26 26  Size==0).     &&
16ed0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
16ee0 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
16ef0 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 20  PCache)==0 .    
16f00 20 26 26 20 70 61 67 65 53 69 7a 65 20 26 26 20   && pageSize && 
16f10 70 61 67 65 53 69 7a 65 21 3d 70 50 61 67 65 72  pageSize!=pPager
16f20 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 20 20  ->pageSize .    
16f30 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  ){.      char *p
16f40 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71  New = (char *)sq
16f50 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
16f60 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
16f70 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20   if( !pNew ){.  
16f80 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
16f90 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
16fa0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 61  else{.        pa
16fb0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
16fc0 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
16fd0 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  r->pageSize = pa
16fe0 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  geSize;.        
16ff0 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
17000 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
17010 65 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  e);.        pPag
17020 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  er->pTmpSpace = 
17030 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 73 71  pNew;.        sq
17040 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 50 61  lite3PcacheSetPa
17050 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  geSize(pPager->p
17060 50 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65  PCache, pageSize
17070 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
17080 0a 20 20 20 20 2a 70 50 61 67 65 53 69 7a 65 20  .    *pPageSize 
17090 3d 20 28 75 31 36 29 70 50 61 67 65 72 2d 3e 70  = (u16)pPager->p
170a0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 69 66 28  ageSize;.    if(
170b0 20 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e 52   nReserve<0 ) nR
170c0 65 73 65 72 76 65 20 3d 20 70 50 61 67 65 72 2d  eserve = pPager-
170d0 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61  >nReserve;.    a
170e0 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
170f0 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 31  =0 && nReserve<1
17100 30 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  000 );.    pPage
17110 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 69  r->nReserve = (i
17120 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 20  16)nReserve;.   
17130 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
17140 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
17150 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17160 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
17170 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d  nter to the "tem
17180 70 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66  porary page" buf
17190 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61  fer held interna
171a0 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61  lly.** by the pa
171b0 67 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20  ger.  This is a 
171c0 62 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62  buffer that is b
171d0 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ig enough to hol
171e0 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20  d the.** entire 
171f0 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74  content of a dat
17200 61 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69  abase page.  Thi
17210 73 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64  s buffer is used
17220 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64   internally.** d
17230 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61  uring rollback a
17240 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77  nd will be overw
17250 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20  ritten whenever 
17260 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63  a rollback.** oc
17270 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72  curs.  But other
17280 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65   modules are fre
17290 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c  e to use it too,
172a0 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e   as long as.** n
172b0 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20  o rollbacks are 
172c0 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f  happening..*/.vo
172d0 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
172e0 54 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20  TempSpace(Pager 
172f0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
17300 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  rn pPager->pTmpS
17310 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  pace;.}../*.** A
17320 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68  ttempt to set th
17330 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61  e maximum databa
17340 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66  se page count if
17350 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
17360 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f  ive. .** Make no
17370 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61   changes if mxPa
17380 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65  ge is zero or ne
17390 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76  gative.  And nev
173a0 65 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a  er reduce the.**
173b0 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
173c0 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75  unt below the cu
173d0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
173e0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
173f0 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
17400 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
17410 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d  he current maxim
17420 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
17430 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
17440 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50  erMaxPageCount(P
17450 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
17460 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28  t mxPage){.  if(
17470 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20   mxPage>0 ){.   
17480 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
17490 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20  = mxPage;.  }.  
174a0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
174b0 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29  count(pPager, 0)
174c0 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
174d0 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  r->mxPgno;.}../*
174e0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
174f0 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65  g set of routine
17500 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69  s are used to di
17510 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61  sable the simula
17520 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72  ted.** I/O error
17530 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65   mechanism.  The
17540 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
17550 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69  used to avoid si
17560 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72  mulated.** error
17570 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72  s in places wher
17580 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  e we do not care
17590 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a   about errors..*
175a0 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51  *.** Unless -DSQ
175b0 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75  LITE_TEST=1 is u
175c0 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69  sed, these routi
175d0 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f  nes are all no-o
175e0 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61  ps.** and genera
175f0 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23  te no code..*/.#
17600 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
17610 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  T.extern int sql
17620 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
17630 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e  nding;.extern in
17640 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  t sqlite3_io_err
17650 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69  or_hit;.static i
17660 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f  nt saved_cnt;.vo
17670 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  id disable_simul
17680 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76  ated_io_errors(v
17690 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e  oid){.  saved_cn
176a0 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  t = sqlite3_io_e
176b0 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20  rror_pending;.  
176c0 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
176d0 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d  _pending = -1;.}
176e0 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d  .void enable_sim
176f0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
17700 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
17710 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
17720 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a  ng = saved_cnt;.
17730 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
17740 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
17750 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
17760 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73   define enable_s
17770 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
17780 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  rs().#endif../*.
17790 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73  ** Read the firs
177a0 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74  t N bytes from t
177b0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
177c0 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65  the file into me
177d0 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65  mory.** that pDe
177e0 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a  st points to. .*
177f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
17800 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
17810 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
17820 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29   (zFilename=="")
17830 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f  , or.** opened o
17840 6e 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68  n a file less th
17850 61 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69  an N bytes in si
17860 7a 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62  ze, the output b
17870 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f  uffer is.** zero
17880 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
17890 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72   returned. The r
178a0 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69  ationale for thi
178b0 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20 0a  s is that this .
178c0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  ** function is u
178d0 73 65 64 20 74 6f 20 72 65 61 64 20 64 61 74 61  sed to read data
178e0 62 61 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e  base headers, an
178f0 64 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e  d a new transien
17900 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a  t or.** zero siz
17910 65 64 20 64 61 74 61 62 61 73 65 20 68 61 73 20  ed database has 
17920 61 20 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f  a header than co
17930 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20  nsists entirely 
17940 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a  of zeroes..**.**
17950 20 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72   If any IO error
17960 20 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49   apart from SQLI
17970 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
17980 45 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  EAD is encounter
17990 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  ed,.** the error
179a0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
179b0 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  d to the caller 
179c0 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  and the contents
179d0 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75   of the.** outpu
179e0 74 20 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e  t buffer undefin
179f0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
17a00 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
17a10 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61  eader(Pager *pPa
17a20 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69  ger, int N, unsi
17a30 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74  gned char *pDest
17a40 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
17a50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65  LITE_OK;.  memse
17a60 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a  t(pDest, 0, N);.
17a70 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
17a80 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
17a90 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
17aa0 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e   );.  if( isOpen
17ab0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
17ac0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
17ad0 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20  HDR %p 0 %d\n", 
17ae0 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20  pPager, N)).    
17af0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
17b00 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
17b10 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20  Dest, N, 0);.   
17b20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17b30 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
17b40 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
17b50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
17b60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
17b70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
17b80 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
17b90 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
17ba0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
17bb0 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77  associated .** w
17bc0 69 74 68 20 70 50 61 67 65 72 2e 20 4e 6f 72 6d  ith pPager. Norm
17bd0 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20 63 61  ally, this is ca
17be0 6c 63 75 6c 61 74 65 64 20 61 73 20 28 3c 64 62  lculated as (<db
17bf0 20 66 69 6c 65 20 73 69 7a 65 3e 2f 3c 70 61 67   file size>/<pag
17c00 65 2d 73 69 7a 65 3e 29 2e 0a 2a 2a 20 48 6f 77  e-size>)..** How
17c10 65 76 65 72 2c 20 69 66 20 74 68 65 20 66 69 6c  ever, if the fil
17c20 65 20 69 73 20 62 65 74 77 65 65 6e 20 31 20 61  e is between 1 a
17c30 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62  nd <page-size> b
17c40 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68  ytes in size, th
17c50 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20 63  en .** this is c
17c60 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20 70 61  onsidered a 1 pa
17c70 67 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  ge file..**.** I
17c80 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
17c90 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68  n error state wh
17ca0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
17cb0 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e   is called, then
17cc0 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 20 73 74   the.** error st
17cd0 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
17ce0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
17cf0 70 6e 50 61 67 65 20 6c 65 66 74 20 75 6e 63 68  pnPage left unch
17d00 61 6e 67 65 64 2e 20 4f 72 2c 0a 2a 2a 20 69 66  anged. Or,.** if
17d10 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d   the file system
17d20 20 68 61 73 20 74 6f 20 62 65 20 71 75 65 72 69   has to be queri
17d30 65 64 20 66 6f 72 20 74 68 65 20 73 69 7a 65 20  ed for the size 
17d40 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 0a  of the file and.
17d50 2a 2a 20 74 68 65 20 71 75 65 72 79 20 61 74 74  ** the query att
17d60 65 6d 70 74 20 72 65 74 75 72 6e 73 20 61 6e 20  empt returns an 
17d70 49 4f 20 65 72 72 6f 72 2c 20 74 68 65 20 49 4f  IO error, the IO
17d80 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
17d90 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a  eturned.** and *
17da0 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20 75  pnPage is left u
17db0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
17dc0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 65 76  Otherwise, if ev
17dd0 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
17de0 65 73 73 66 75 6c 2c 20 74 68 65 6e 20 53 51 4c  essful, then SQL
17df0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
17e00 65 64 0a 2a 2a 20 61 6e 64 20 2a 70 6e 50 61 67  ed.** and *pnPag
17e10 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
17e20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
17e30 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
17e40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
17e50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61  agerPagecount(Pa
17e60 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
17e70 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e   *pnPage){.  Pgn
17e80 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  o nPage;        
17e90 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
17ea0 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70  to return via *p
17eb0 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49  nPage */..  /* I
17ec0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61  f the pager is a
17ed0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72  lready in the er
17ee0 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75 72  ror state, retur
17ef0 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
17f00 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  . */.  if( pPage
17f10 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
17f20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
17f30 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20  >errCode;.  }.. 
17f40 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68   /* Determine th
17f50 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
17f60 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 53  s in the file. S
17f70 74 6f 72 65 20 74 68 69 73 20 69 6e 20 6e 50 61  tore this in nPa
17f80 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ge. */.  if( pPa
17f90 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
17fa0 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20   ){.    nPage = 
17fb0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
17fc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
17fd0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
17fe0 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 72 65       /* Error re
17ff0 74 75 72 6e 65 64 20 62 79 20 4f 73 46 69 6c 65  turned by OsFile
18000 53 69 7a 65 28 29 20 2a 2f 0a 20 20 20 20 69 36  Size() */.    i6
18010 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  4 n = 0;        
18020 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 73 69        /* File si
18030 7a 65 20 69 6e 20 62 79 74 65 73 20 72 65 74 75  ze in bytes retu
18040 72 6e 65 64 20 62 79 20 4f 73 46 69 6c 65 53 69  rned by OsFileSi
18050 7a 65 28 29 20 2a 2f 0a 0a 20 20 20 20 61 73 73  ze() */..    ass
18060 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
18070 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
18080 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
18090 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
180a0 61 67 65 72 2d 3e 66 64 29 20 26 26 20 28 30 20  ager->fd) && (0 
180b0 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
180c0 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
180d0 72 2d 3e 66 64 2c 20 26 6e 29 29 29 20 29 7b 0a  r->fd, &n))) ){.
180e0 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
180f0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
18100 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
18110 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e      }.    if( n>
18120 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70  0 && n<pPager->p
18130 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
18140 20 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20   nPage = 1;.    
18150 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61  }else{.      nPa
18160 67 65 20 3d 20 28 50 67 6e 6f 29 28 6e 20 2f 20  ge = (Pgno)(n / 
18170 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
18180 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
18190 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
181a0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
181b0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
181c0 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
181d0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
181e0 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  leSize = nPage;.
181f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
18200 53 69 7a 65 56 61 6c 69 64 20 3d 20 31 3b 0a 20  SizeValid = 1;. 
18210 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
18220 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75  f the current nu
18230 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
18240 20 74 68 65 20 66 69 6c 65 20 69 73 20 67 72 65   the file is gre
18250 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20  ater than the . 
18260 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d   ** configured m
18270 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d  aximum pager num
18280 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68  ber, increase th
18290 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20  e allowed limit 
182a0 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  so.  ** that the
182b0 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61   file can be rea
182c0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50  d..  */.  if( nP
182d0 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  age>pPager->mxPg
182e0 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
182f0 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f  ->mxPgno = (Pgno
18300 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2f  )nPage;.  }..  /
18310 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74  * Set the output
18320 20 76 61 72 69 61 62 6c 65 20 61 6e 64 20 72 65   variable and re
18330 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 2a  turn SQLITE_OK *
18340 2f 0a 20 20 69 66 28 20 70 6e 50 61 67 65 20 29  /.  if( pnPage )
18350 7b 0a 20 20 20 20 2a 70 6e 50 61 67 65 20 3d 20  {.    *pnPage = 
18360 6e 50 61 67 65 3b 0a 20 20 7d 0a 20 20 72 65 74  nPage;.  }.  ret
18370 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
18380 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  .../*.** Try to 
18390 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66  obtain a lock of
183a0 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f   type locktype o
183b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
183c0 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d  ile. If.** a sim
183d0 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72 20  ilar or greater 
183e0 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
183f0 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74  held, this funct
18400 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a  ion is a no-op.*
18410 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  * (returning SQL
18420 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65  ITE_OK immediate
18430 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ly)..**.** Other
18440 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f  wise, attempt to
18450 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b   obtain the lock
18460 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
18470 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a  Lock(). Invoke .
18480 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ** the busy call
18490 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b  back if the lock
184a0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f   is currently no
184b0 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70  t available. Rep
184c0 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68  eat .** until th
184d0 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
184e0 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72  returns false or
184f0 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d   until the attem
18500 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e  pt to .** obtain
18510 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65   the lock succee
18520 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ds..**.** Return
18530 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
18540 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72  ccess and an err
18550 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61  or code if we ca
18560 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74  nnot obtain.** t
18570 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20  he lock. If the 
18580 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
18590 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73   successfully, s
185a0 65 74 20 74 68 65 20 50 61 67 65 72 2e 73 74 61  et the Pager.sta
185b0 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  te .** variable 
185c0 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f  to locktype befo
185d0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
185e0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
185f0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50  r_wait_on_lock(P
18600 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
18610 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
18620 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
18630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18640 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
18650 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  de */..  /* The 
18660 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d  OS lock values m
18670 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
18680 61 73 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63  as the Pager loc
18690 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73  k values */.  as
186a0 73 65 72 74 28 20 50 41 47 45 52 5f 53 48 41 52  sert( PAGER_SHAR
186b0 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ED==SHARED_LOCK 
186c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
186d0 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53  ER_RESERVED==RES
186e0 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
186f0 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 45 58  assert( PAGER_EX
18700 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49  CLUSIVE==EXCLUSI
18710 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  VE_LOCK );..  /*
18720 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
18730 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b  currently unlock
18740 65 64 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65  ed then the size
18750 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e   must be unknown
18760 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
18770 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
18780 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61  ER_SHARED || pPa
18790 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
187a0 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ==0 );..  /* Che
187b0 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20  ck that this is 
187c0 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28  either a no-op (
187d0 62 65 63 61 75 73 65 20 74 68 65 20 72 65 71 75  because the requ
187e0 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20  ested lock is . 
187f0 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64   ** already held
18800 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  , or one of the 
18810 74 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68 61  transistions tha
18820 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  t the busy-handl
18830 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69  er.  ** may be i
18840 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20 61  nvoked during, a
18850 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
18860 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20  comment above.  
18870 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  ** sqlite3PagerS
18880 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29 2e  etBusyhandler().
18890 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
188a0 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d  (pPager->state>=
188b0 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20 20  locktype).      
188c0 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73 74 61   || (pPager->sta
188d0 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
188e0 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 50 41   && locktype==PA
188f0 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20  GER_SHARED).    
18900 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73     || (pPager->s
18910 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
18920 52 56 45 44 20 26 26 20 6c 6f 63 6b 74 79 70 65  RVED && locktype
18930 3d 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ==PAGER_EXCLUSIV
18940 45 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 70  E).  );..  if( p
18950 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f  Pager->state>=lo
18960 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63  cktype ){.    rc
18970 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
18980 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a  }else{.    do {.
18990 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
189a0 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
189b0 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a  >fd, locktype);.
189c0 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d      }while( rc==
189d0 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
189e0 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
189f0 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73  ler(pPager->pBus
18a00 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a  yHandlerArg) );.
18a10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18a20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
18a30 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 28  Pager->state = (
18a40 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20  u8)locktype;.   
18a50 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43     IOTRACE(("LOC
18a60 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  K %p %d\n", pPag
18a70 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20  er, locktype)). 
18a80 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
18a90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
18aa0 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54 72  unction assertTr
18ab0 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
18ac0 28 70 50 61 67 65 72 29 20 63 68 65 63 6b 73 20  (pPager) checks 
18ad0 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  that one of the 
18ae0 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  .** following is
18af0 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64 69   true for all di
18b00 72 74 79 20 70 61 67 65 73 20 63 75 72 72 65 6e  rty pages curren
18b10 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 2d  tly in the page-
18b20 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  cache:.**.**   a
18b30 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  ) The page numbe
18b40 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  r is less than o
18b50 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 73  r equal to the s
18b60 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20  ize of the .**  
18b70 20 20 20 20 63 75 72 72 65 6e 74 20 64 61 74 61      current data
18b80 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20 70  base image, in p
18b90 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20  ages, OR.**.**  
18ba0 20 62 29 20 69 66 20 74 68 65 20 70 61 67 65 20   b) if the page 
18bb0 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72 69  content were wri
18bc0 74 74 65 6e 20 61 74 20 74 68 69 73 20 74 69 6d  tten at this tim
18bd0 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a  e, it would not.
18be0 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65 73  **      be neces
18bf0 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68  sary to write th
18c00 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e  e current conten
18c10 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75 62  t out to the sub
18c20 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20  -journal.**     
18c30 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20   (as determined 
18c40 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a  by function subj
18c50 52 65 71 75 69 72 65 73 50 61 67 65 28 29 29 2e  RequiresPage()).
18c60 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  .**.** If the co
18c70 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65 64  ndition asserted
18c80 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
18c90 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c  n were not true,
18ca0 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72 74   and the.** dirt
18cb0 79 20 70 61 67 65 20 77 65 72 65 20 74 6f 20 62  y page were to b
18cc0 65 20 64 69 73 63 61 72 64 65 64 20 66 72 6f 6d  e discarded from
18cd0 20 74 68 65 20 63 61 63 68 65 20 76 69 61 20 74   the cache via t
18ce0 68 65 20 70 61 67 65 72 53 74 72 65 73 73 28 29  he pagerStress()
18cf0 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61 67  .** routine, pag
18d00 65 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c 64  erStress() would
18d10 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20 63   not write the c
18d20 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74  urrent page cont
18d30 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61  ent to.** the da
18d40 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
18d50 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e  a savepoint tran
18d60 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c  saction were rol
18d70 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a 2a  led back after.*
18d80 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65 64 2c  * this happened,
18d90 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
18da0 61 76 69 6f 75 72 20 77 6f 75 6c 64 20 62 65 20  aviour would be 
18db0 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
18dc0 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e  urrent.** conten
18dd0 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 48  t of the page. H
18de0 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 74 68  owever, since th
18df0 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  is content is no
18e00 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65 69 74  t present in eit
18e10 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  her.** the datab
18e20 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68 65 20  ase file or the 
18e30 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  portion of the r
18e40 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
18e50 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  and .** sub-jour
18e60 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  nal rolled back 
18e70 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c  the content coul
18e80 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f 72 65  d not be restore
18e90 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74  d and the.** dat
18ea0 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f 75 6c  abase image woul
18eb0 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74  d become corrupt
18ec0 2e 20 49 74 20 69 73 20 74 68 65 72 65 66 6f 72  . It is therefor
18ed0 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68 61 74  e fortunate that
18ee0 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63 75 6d   .** this circum
18ef0 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72  stance cannot ar
18f00 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ise..*/.#if defi
18f10 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
18f20 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  ).static void as
18f30 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
18f40 74 72 61 69 6e 74 43 62 28 50 67 48 64 72 20 2a  traintCb(PgHdr *
18f50 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pPg){.  assert( 
18f60 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
18f70 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73 73 65  _DIRTY );.  asse
18f80 72 74 28 20 21 73 75 62 6a 52 65 71 75 69 72 65  rt( !subjRequire
18f90 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20 70 50  sPage(pPg) || pP
18fa0 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50  g->pgno<=pPg->pP
18fb0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a  ager->dbSize );.
18fc0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  }.static void as
18fd0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
18fe0 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a 70 50  traint(Pager *pP
18ff0 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ager){.  sqlite3
19000 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72  PcacheIterateDir
19010 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ty(pPager->pPCac
19020 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e 63 61  he, assertTrunca
19030 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b  teConstraintCb);
19040 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
19050 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  e assertTruncate
19060 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65  Constraint(pPage
19070 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  r).#endif../*.**
19080 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e   Truncate the in
19090 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
190a0 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e   file image to n
190b0 50 61 67 65 20 70 61 67 65 73 2e 20 54 68 69 73  Page pages. This
190c0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f   .** function do
190d0 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  es not actually 
190e0 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
190f0 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
19100 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65  . It .** just se
19110 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ts the internal 
19120 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67  state of the pag
19130 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61  er object so tha
19140 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61  t the .** trunca
19150 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e  tion will be don
19160 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  e when the curre
19170 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
19180 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a  s committed..*/.
19190 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
191a0 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50  rTruncateImage(P
191b0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
191c0 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73  no nPage){.  ass
191d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
191e0 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 61 73  izeValid );.  as
191f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
19200 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20  Size>=nPage );. 
19210 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
19220 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
19230 53 45 52 56 45 44 20 29 3b 0a 20 20 70 50 61 67  SERVED );.  pPag
19240 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
19250 67 65 3b 0a 20 20 61 73 73 65 72 74 54 72 75 6e  ge;.  assertTrun
19260 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  cateConstraint(p
19270 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
19280 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
19290 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
192a0 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
192b0 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
192c0 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
192d0 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
192e0 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
192f0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
19300 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
19310 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
19320 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
19330 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
19340 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
19350 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
19360 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
19370 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
19380 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
19390 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
193a0 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
193b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
193c0 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
193d0 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
193e0 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a  a coredump..**.*
193f0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
19400 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
19410 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
19420 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61  n is active an a
19430 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
19440 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
19450 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  k. If an error o
19460 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
19470 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20   rollback .** a 
19480 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot journal may 
19490 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
194a0 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f  ilesystem but no
194b0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
194c0 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  ed.** to the cal
194d0 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ler..*/.int sqli
194e0 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61  te3PagerClose(Pa
194f0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
19500 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
19510 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
19520 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
19530 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70  ignMalloc();.  p
19540 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
19550 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   0;.  pPager->ex
19560 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b  clusiveMode = 0;
19570 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70  .  pager_reset(p
19580 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 4d 45  Pager);.  if( ME
19590 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72  MDB ){.    pager
195a0 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
195b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
195c0 20 53 65 74 20 50 61 67 65 72 2e 6a 6f 75 72 6e   Set Pager.journ
195d0 61 6c 48 64 72 20 74 6f 20 2d 31 20 66 6f 72 20  alHdr to -1 for 
195e0 74 68 65 20 62 65 6e 65 66 69 74 20 6f 66 20 74  the benefit of t
195f0 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
19600 6b 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  k() .    ** call
19610 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 6d 61   which may be ma
19620 64 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70  de from within p
19630 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
19640 6c 62 61 63 6b 28 29 2e 20 49 66 20 69 74 0a 20  lback(). If it. 
19650 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 2d 31 2c     ** is not -1,
19660 20 74 68 65 6e 20 74 68 65 20 75 6e 73 79 6e 63   then the unsync
19670 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 61 6e  ed portion of an
19680 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
19690 6c 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20 62 65  le may.    ** be
196a0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74   played back int
196b0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
196c0 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
196d0 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 0a  re occurs while.
196e0 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68      ** this is h
196f0 61 70 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61  appening, the da
19700 74 61 62 61 73 65 20 6d 61 79 20 62 65 63 6f 6d  tabase may becom
19710 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a  e corrupt..    *
19720 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  /.    pPager->jo
19730 75 72 6e 61 6c 48 64 72 20 3d 20 2d 31 3b 0a 20  urnalHdr = -1;. 
19740 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e     pagerUnlockAn
19750 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
19760 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
19770 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
19780 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  );.  enable_simu
19790 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
197a0 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
197b0 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50  ("CLOSE %d\n", P
197c0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
197d0 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c  ;.  IOTRACE(("CL
197e0 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  OSE %p\n", pPage
197f0 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  r)).  sqlite3OsC
19800 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
19810 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46  ;.  sqlite3PageF
19820 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
19830 53 70 61 63 65 29 3b 0a 20 20 73 71 6c 69 74 65  Space);.  sqlite
19840 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61  3PcacheClose(pPa
19850 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a  ger->pPCache);..
19860 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
19870 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70 50  S_CODEC.  if( pP
19880 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
19890 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65   ) pPager->xCode
198a0 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43  cFree(pPager->pC
198b0 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  odec);.#endif.. 
198c0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
198d0 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 26 26 20  ->aSavepoint && 
198e0 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  !pPager->pInJour
198f0 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
19900 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
19910 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e  >jfd) && !isOpen
19920 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
19930 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ;..  sqlite3_fre
19940 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
19950 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
19960 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ..#if !defined(N
19970 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
19980 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
19990 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
199a0 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
199b0 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e  page pPg..*/.Pgn
199c0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  o sqlite3PagerPa
199d0 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20  genumber(DbPage 
199e0 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
199f0 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e  pPg->pgno;.}.#en
19a00 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  dif../*.** Incre
19a10 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
19a20 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67  ce count for pag
19a30 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73  e pPg..*/.void s
19a40 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44  qlite3PagerRef(D
19a50 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 73  bPage *pPg){.  s
19a60 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 28  qlite3PcacheRef(
19a70 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  pPg);.}../*.** S
19a80 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ync the journal.
19a90 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
19aa0 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   make sure all t
19ab0 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61  he pages that ha
19ac0 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  ve.** been writt
19ad0 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
19ae0 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20  l have actually 
19af0 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66  reached the surf
19b00 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69  ace of the.** di
19b10 73 6b 20 61 6e 64 20 63 61 6e 20 62 65 20 72 65  sk and can be re
19b20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 65 76  stored in the ev
19b30 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75  ent of a hot-jou
19b40 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  rnal rollback..*
19b50 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 61 67 65  *.** If the Page
19b60 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  r.needSync flag 
19b70 69 73 20 6e 6f 74 20 73 65 74 2c 20 74 68 65 6e  is not set, then
19b80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
19b90 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 4f 74  s a.** no-op. Ot
19ba0 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 63 74  herwise, the act
19bb0 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64 65  ions required de
19bc0 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  pend on the jour
19bd0 6e 61 6c 2d 6d 6f 64 65 0a 2a 2a 20 61 6e 64 20  nal-mode.** and 
19be0 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72 61  the device chara
19bf0 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74 68  cteristics of th
19c00 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  e the file-syste
19c10 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  m, as follows:.*
19c20 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
19c30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
19c40 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
19c50 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63  rnal file, no ac
19c60 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20  tion need.**    
19c70 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a   be taken..**.**
19c80 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20     * Otherwise, 
19c90 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f  if the device do
19ca0 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74  es not support t
19cb0 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70  he SAFE_APPEND p
19cc0 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20  roperty,.**     
19cd0 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  then the nRec fi
19ce0 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  eld of the most 
19cf0 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e  recently written
19d00 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a   journal header.
19d10 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74 65  **     is update
19d20 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  d to contain the
19d30 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e   number of journ
19d40 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  al records that 
19d50 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e  have.**     been
19d60 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69   written followi
19d70 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70 61  ng it. If the pa
19d80 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67  ger is operating
19d90 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a   in full-sync.**
19da0 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20       mode, then 
19db0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
19dc0 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72   is synced befor
19dd0 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73 20  e this field is 
19de0 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
19df0 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63 65   * If the device
19e00 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
19e10 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c  t the SEQUENTIAL
19e20 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20   property, then 
19e30 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  .**     journal 
19e40 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a  file is synced..
19e50 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65  **.** Or, in pse
19e60 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20  udo-code:.**.** 
19e70 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65    if( NOT <in-me
19e80 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b  mory journal> ){
19e90 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20  .**     if( NOT 
19ea0 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a  SAFE_APPEND ){.*
19eb0 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c  *       if( <ful
19ec0 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78  l-sync mode> ) x
19ed0 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
19ee0 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c  le>);.**       <
19ef0 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c  update nRec fiel
19f00 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20  d>.**     } .** 
19f10 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55      if( NOT SEQU
19f20 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c  ENTIAL ) xSync(<
19f30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a  journal file>);.
19f40 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65  **   }.**.** The
19f50 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20   Pager.needSync 
19f60 66 6c 61 67 20 69 73 20 6e 65 76 65 72 20 62 65  flag is never be
19f70 20 73 65 74 20 66 6f 72 20 74 65 6d 70 6f 72 61   set for tempora
19f80 72 79 20 66 69 6c 65 73 2c 20 6f 72 20 61 6e 79  ry files, or any
19f90 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 72 61 74 69  .** file operati
19fa0 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
19fb0 64 65 20 28 50 61 67 65 72 2e 6e 6f 53 79 6e 63  de (Pager.noSync
19fc0 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f   set to non-zero
19fd0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  )..**.** If succ
19fe0 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75  essful, this rou
19ff0 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20  tine clears the 
1a000 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
1a010 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a  flag of every .*
1a020 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79  * page currently
1a030 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20   held in memory 
1a040 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1a050 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
1a060 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73  n IO.** error is
1a070 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
1a080 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
1a090 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1a0a0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
1a0b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
1a0c0 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ncJournal(Pager 
1a0d0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
1a0e0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1a0f0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1a100 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
1a110 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  e );.    if( pPa
1a120 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
1a130 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
1a140 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  ODE_MEMORY ){.  
1a150 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20      int rc;     
1a160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a170 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1a180 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20  rn code */.     
1a190 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d   const int iDc =
1a1a0 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
1a1b0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
1a1c0 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
1a1d0 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
1a1e0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
1a1f0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ;..      if( 0==
1a200 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
1a210 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29  P_SAFE_APPEND) )
1a220 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
1a230 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69  s block deals wi
1a240 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70 72  th an obscure pr
1a250 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c 61  oblem. If the la
1a260 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20  st connection.  
1a270 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72        ** that wr
1a280 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61 74 61  ote to this data
1a290 62 61 73 65 20 77 61 73 20 6f 70 65 72 61 74 69  base was operati
1a2a0 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74  ng in persistent
1a2b0 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20  -journal.       
1a2c0 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74   ** mode, then t
1a2d0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1a2e0 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e  may at this poin
1a2f0 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c 61  t actually be la
1a300 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  rger.        ** 
1a310 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e  than Pager.journ
1a320 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66 20  alOff bytes. If 
1a330 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20 69  the next thing i
1a340 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  n the journal.  
1a350 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68 61        ** file ha
1a360 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f  ppens to be a jo
1a370 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77 72  urnal-header (wr
1a380 69 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f 66  itten as part of
1a390 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1a3a0 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74  previous connect
1a3b0 69 6f 6e 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  ions transaction
1a3c0 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20 6f  ), and a crash o
1a3d0 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20  r power-failure 
1a3e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63 75  .        ** occu
1a3f0 72 73 20 61 66 74 65 72 20 6e 52 65 63 20 69 73  rs after nRec is
1a400 20 75 70 64 61 74 65 64 20 62 75 74 20 62 65 66   updated but bef
1a410 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  ore this connect
1a420 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20 20  ion writes .    
1a430 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20      ** anything 
1a440 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  else to the jour
1a450 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d  nal file (or com
1a460 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20  mits/rolls back 
1a470 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  its .        ** 
1a480 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68  transaction), th
1a490 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62 65  en SQLite may be
1a4a0 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77 68  come confused wh
1a4b0 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20 20  en doing the .  
1a4c0 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75        ** hot-jou
1a4d0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f  rnal rollback fo
1a4e0 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72 79  llowing recovery
1a4f0 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61  . It may roll ba
1a500 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a  ck all.        *
1a510 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  * of this connec
1a520 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65 6e  tions data, then
1a530 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c   proceed to roll
1a540 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c 64  ing back the old
1a550 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  ,.        ** out
1a560 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74 68  -of-date data th
1a570 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44  at follows it. D
1a580 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
1a590 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  on..        **. 
1a5a0 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72         ** To wor
1a5b0 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69  k around this, i
1a5c0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1a5d0 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72 20 74  le does appear t
1a5e0 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20  o contain.      
1a5f0 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65 61    ** a valid hea
1a600 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61  der following Pa
1a610 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  ger.journalOff, 
1a620 74 68 65 6e 20 77 72 69 74 65 20 61 20 30 78 30  then write a 0x0
1a630 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74  0.        ** byt
1a640 65 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  e to the start o
1a650 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74 20  f it to prevent 
1a660 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65  it from being re
1a670 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20  cognized..      
1a680 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
1a690 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48 64  Variable iNextHd
1a6a0 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
1a6b0 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61 74 20  o the offset at 
1a6c0 77 68 69 63 68 20 74 68 69 73 0a 20 20 20 20 20  which this.     
1a6d0 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69     ** problemati
1a6e0 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f 63  c header will oc
1a6f0 63 75 72 2c 20 69 66 20 69 74 20 65 78 69 73 74  cur, if it exist
1a700 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73 65  s. aMagic is use
1a710 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  d .        ** as
1a720 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66   a temporary buf
1a730 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20 74  fer to inspect t
1a740 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65 20  he first couple 
1a750 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20 20  of bytes of.    
1a760 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e      ** the poten
1a770 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tial journal hea
1a780 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  der..        */.
1a790 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65 78          i64 iNex
1a7a0 74 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  tHdrOffset;.    
1a7b0 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38 5d      u8 aMagic[8]
1a7c0 3b 0a 09 75 38 20 7a 48 65 61 64 65 72 5b 73 69  ;..u8 zHeader[si
1a7d0 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
1a7e0 69 63 29 2b 34 5d 3b 0a 0a 09 6d 65 6d 63 70 79  ic)+4];...memcpy
1a7f0 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e  (zHeader, aJourn
1a800 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
1a810 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
1a820 0a 09 70 75 74 33 32 62 69 74 73 28 26 7a 48 65  ..put32bits(&zHe
1a830 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
1a840 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61  rnalMagic)], pPa
1a850 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20  ger->nRec);..   
1a860 20 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66       iNextHdrOff
1a870 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  set = journalHdr
1a880 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
1a890 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1a8a0 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
1a8b0 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
1a8c0 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  8, iNextHdrOffse
1a8d0 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
1a8e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1a8f0 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69   0==memcmp(aMagi
1a900 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
1a910 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 8) ){.        
1a920 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
1a930 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a  8 zerobyte = 0;.
1a940 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1a950 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
1a960 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f  ager->jfd, &zero
1a970 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64  byte, 1, iNextHd
1a980 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  rOffset);.      
1a990 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1a9a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
1a9b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
1a9c0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
1a9d0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1a9e0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a   rc;.        }..
1a9f0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1aa00 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
1aa10 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
1aa20 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66   file header. If
1aa30 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   in.        ** f
1aa40 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20  ull-synchronous 
1aa50 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
1aa60 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68  ournal first. Th
1aa70 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a  is ensures that.
1aa80 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64          ** all d
1aa90 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68  ata has really h
1aaa0 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f  it the disk befo
1aab0 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  re nRec is updat
1aac0 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20  ed to mark.     
1aad0 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61     ** it as a ca
1aae0 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c  ndidate for roll
1aaf0 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  back..        **
1ab00 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
1ab10 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
1ab20 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65   if the persiste
1ab30 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74  nt media support
1ab40 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  s the.        **
1ab50 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
1ab60 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69  perty. Because i
1ab70 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
1ab80 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a  s not possible .
1ab90 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67          ** for g
1aba0 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62  arbage data to b
1abb0 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  e appended to th
1abc0 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63  e file, the nRec
1abd0 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a   field.        *
1abe0 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  * is populated w
1abf0 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77  ith 0xFFFFFFFF w
1ac00 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
1ac10 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
1ac20 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64  n.        ** and
1ac30 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20   never needs to 
1ac40 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20  be updated..    
1ac50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
1ac60 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
1ac70 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53  ync && 0==(iDc&S
1ac80 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
1ac90 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
1aca0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
1acb0 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
1acc0 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
1acd0 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
1ace0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1acf0 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
1ad00 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20  ger)).          
1ad10 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
1ad20 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
1ad30 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
1ad40 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  gs);.          i
1ad50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ad60 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1ad70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ad80 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
1ad90 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65  p %lld\n", pPage
1ada0 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
1adb0 61 6c 48 64 72 29 29 3b 0a 20 20 20 20 20 20 20  alHdr));.       
1adc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
1add0 72 69 74 65 28 0a 20 20 20 20 20 20 20 20 20 20  rite(.          
1ade0 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a    pPager->jfd, z
1adf0 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
1ae00 48 65 61 64 65 72 29 2c 20 70 50 61 67 65 72 2d  Header), pPager-
1ae10 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 09 29 3b 0a  >journalHdr..);.
1ae20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1ae30 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1ae40 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1ae50 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
1ae60 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
1ae70 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
1ae80 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
1ae90 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
1aea0 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
1aeb0 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
1aec0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
1aed0 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
1aee0 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d  r)).        rc =
1aef0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
1af00 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
1af10 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 7c 20  er->sync_flags| 
1af20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67  .          (pPag
1af30 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 3d 3d  er->sync_flags==
1af40 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
1af50 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54  ?SQLITE_SYNC_DAT
1af60 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20  AONLY:0).       
1af70 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1af80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1af90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1afa0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1afb0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
1afc0 65 20 77 61 73 20 6a 75 73 74 20 73 75 63 63 65  e was just succe
1afd0 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20  ssfully synced. 
1afe0 53 65 74 20 50 61 67 65 72 2e 6e 65 65 64 53 79  Set Pager.needSy
1aff0 6e 63 20 0a 20 20 20 20 2a 2a 20 74 6f 20 7a 65  nc .    ** to ze
1b000 72 6f 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65  ro and clear the
1b010 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
1b020 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 20 70 61 67   flag on all pag
1b030 65 73 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ess..    */.    
1b040 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1b050 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
1b060 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
1b070 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 1;.    sqlite
1b080 33 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63  3PcacheClearSync
1b090 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50  Flags(pPager->pP
1b0a0 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 72  Cache);.  }..  r
1b0b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b0c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  .}../*.** The ar
1b0d0 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69  gument is the fi
1b0e0 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20  rst in a linked 
1b0f0 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61  list of dirty pa
1b100 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a  ges connected.**
1b110 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
1b120 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68  irty pointer. Th
1b130 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  is function writ
1b140 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74  es each one of t
1b150 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  he.** in-memory 
1b160 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73  pages in the lis
1b170 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
1b180 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75  e file. The argu
1b190 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e  ment may.** be N
1b1a0 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e  ULL, representin
1b1b0 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e  g an empty list.
1b1c0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
1b1d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a  is function is.*
1b1e0 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  * a no-op..**.**
1b1f0 20 54 68 65 20 70 61 67 65 72 20 6d 75 73 74 20   The pager must 
1b200 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20  hold at least a 
1b210 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68  RESERVED lock wh
1b220 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1b230 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42  .** is called. B
1b240 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e  efore writing an
1b250 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  ything to the da
1b260 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
1b270 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67  s lock.** is upg
1b280 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c  raded to an EXCL
1b290 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74  USIVE lock. If t
1b2a0 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62  he lock cannot b
1b2b0 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53  e obtained,.** S
1b2c0 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
1b2d0 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61  turned and no da
1b2e0 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
1b2f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b300 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68  le..** .** If th
1b310 65 20 70 61 67 65 72 20 69 73 20 61 20 74 65 6d  e pager is a tem
1b320 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64  p-file pager and
1b330 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   the actual file
1b340 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20  -system file.** 
1b350 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c  is not yet open,
1b360 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 61   it is created a
1b370 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  nd opened before
1b380 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a   any data is .**
1b390 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a   written out..**
1b3a0 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63  .** Once the loc
1b3b0 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67 72 61  k has been upgra
1b3c0 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65  ded and, if nece
1b3d0 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20  ssary, the file 
1b3e0 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70  opened,.** the p
1b3f0 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e  ages are written
1b400 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
1b410 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73  base file in lis
1b420 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67  t order. Writing
1b430 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b  .** a page is sk
1b440 69 70 70 65 64 20 69 66 20 69 74 20 6d 65 65 74  ipped if it meet
1b450 73 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  s either of the 
1b460 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72  following criter
1b470 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ia:.**.**   * Th
1b480 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
1b490 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 61   greater than Pa
1b4a0 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a  ger.dbSize, or.*
1b4b0 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f  *   * The PGHDR_
1b4c0 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20  DONT_WRITE flag 
1b4d0 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61  is set on the pa
1b4e0 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69  ge..**.** If wri
1b4f0 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20  ting out a page 
1b500 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62  causes the datab
1b510 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77  ase file to grow
1b520 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69  , Pager.dbFileSi
1b530 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64  ze.** is updated
1b540 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66   accordingly. If
1b550 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74 74   page 1 is writt
1b560 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65  en out, then the
1b570 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a   value cached.**
1b580 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65   in Pager.dbFile
1b590 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65  Vers[] is update
1b5a0 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e  d to match the n
1b5b0 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  ew value stored 
1b5c0 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  in.** the databa
1b5d0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
1b5e0 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
1b5f0 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
1b600 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1b610 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
1b620 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e  r .** occurs, an
1b630 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
1b640 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20  s returned. Or, 
1b650 69 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  if the EXCLUSIVE
1b660 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20   lock cannot.** 
1b670 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c  be obtained, SQL
1b680 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
1b690 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1b6a0 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f  int pager_write_
1b6b0 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a  pagelist(PgHdr *
1b6c0 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20  pList){.  Pager 
1b6d0 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20  *pPager;        
1b6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b6f0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
1b700 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1b710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b720 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1b730 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66  rn code */..  if
1b740 28 20 4e 45 56 45 52 28 70 4c 69 73 74 3d 3d 30  ( NEVER(pList==0
1b750 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
1b760 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d  E_OK;.  pPager =
1b770 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a   pList->pPager;.
1b780 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
1b790 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65  int there may be
1b7a0 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56   either a RESERV
1b7b0 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
1b7c0 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  lock on the.  **
1b7d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1b7e0 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
1b7f0 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ady an EXCLUSIVE
1b800 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f   lock, the follo
1b810 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 20 69  wing.  ** call i
1b820 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a  s a no-op..  **.
1b830 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20    ** Moving the 
1b840 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56  lock from RESERV
1b850 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20  ED to EXCLUSIVE 
1b860 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65  actually involve
1b870 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72  s going.  ** thr
1b880 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64  ough an intermed
1b890 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49  iate state PENDI
1b8a0 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20  NG.   A PENDING 
1b8b0 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65  lock prevents ne
1b8c0 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66  w.  ** readers f
1b8d0 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f  rom attaching to
1b8e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75   the database bu
1b8f0 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e  t is unsufficien
1b900 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a  t for us to.  **
1b910 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65   write.  The ide
1b920 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c  a of a PENDING l
1b930 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e  ock is to preven
1b940 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72  t new readers fr
1b950 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69  om.  ** coming i
1b960 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20  n while we wait 
1b970 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61  for existing rea
1b980 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20  ders to clear.. 
1b990 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74   **.  ** While t
1b9a0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
1b9b0 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74  he RESERVED stat
1b9c0 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  e, the original 
1b9d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
1b9e0 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20  ** is unchanged 
1b9f0 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62  and we can rollb
1ba00 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
1ba10 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74  ng to playback t
1ba20 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
1ba30 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
1ba40 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  l database file.
1ba50 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69    Once we transi
1ba60 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43  tion to.  ** EXC
1ba70 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73  LUSIVE, it means
1ba80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ba90 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e  le has been chan
1baa0 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c  ged and any roll
1bab0 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72  back.  ** will r
1bac0 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c  equire a journal
1bad0 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a   playback..  */.
1bae0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1baf0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
1bb00 45 53 45 52 56 45 44 20 29 3b 0a 20 20 72 63 20  ESERVED );.  rc 
1bb10 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
1bb20 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
1bb30 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 0a 20  LUSIVE_LOCK);.. 
1bb40 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
1bb50 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 68  is a temp-file h
1bb60 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
1bb70 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20  opened, open it 
1bb80 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20  now. It.  ** is 
1bb90 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
1bba0 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65 72 20   rc to be other 
1bbb0 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  than SQLITE_OK i
1bbc0 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20  f this branch.  
1bbd0 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61 73 20  ** is taken, as 
1bbe0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
1bbf0 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20  ck() is a no-op 
1bc00 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a  for temp-files..
1bc10 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70    */.  if( !isOp
1bc20 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
1bc30 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1bc40 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26  ager->tempFile &
1bc50 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1bc60 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
1bc70 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72  rOpentemp(pPager
1bc80 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  , pPager->fd, pP
1bc90 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b  ager->vfsFlags);
1bca0 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72  .  }..  while( r
1bcb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1bcc0 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e  pList ){.    Pgn
1bcd0 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e  o pgno = pList->
1bce0 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  pgno;..    /* If
1bcf0 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79   there are dirty
1bd00 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61   pages in the pa
1bd10 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61  ge cache with pa
1bd20 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74  ge numbers great
1bd30 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50  er.    ** than P
1bd40 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69  ager.dbSize, thi
1bd50 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50  s means sqlite3P
1bd60 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
1bd70 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74  e() was called t
1bd80 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68  o.    ** make th
1bd90 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28  e file smaller (
1bda0 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75  presumably by au
1bdb0 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e  to-vacuum code).
1bdc0 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20   Do not write.  
1bdd0 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61    ** any such pa
1bde0 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  ges to the file.
1bdf0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
1be00 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74  lso, do not writ
1be10 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74  e out any page t
1be20 68 61 74 20 68 61 73 20 74 68 65 20 50 47 48 44  hat has the PGHD
1be30 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61  R_DONT_WRITE fla
1be40 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65  g.    ** set (se
1be50 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65  t by sqlite3Page
1be60 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a 20  rDontWrite()).. 
1be70 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67     */.    if( pg
1be80 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69  no<=pPager->dbSi
1be90 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d  ze && 0==(pList-
1bea0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e  >flags&PGHDR_DON
1beb0 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20  T_WRITE) ){.    
1bec0 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28    i64 offset = (
1bed0 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
1bee0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20  ger->pageSize;  
1bef0 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72   /* Offset to wr
1bf00 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61  ite */.      cha
1bf10 72 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20  r *pData;       
1bf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1bf40 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20  ata to write */ 
1bf50 20 20 20 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e     ..      /* En
1bf60 63 6f 64 65 20 74 68 65 20 64 61 74 61 62 61 73  code the databas
1bf70 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43  e */.      CODEC
1bf80 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d  2(pPager, pList-
1bf90 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c  >pData, pgno, 6,
1bfa0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1bfb0 4f 4d 45 4d 2c 20 70 44 61 74 61 29 3b 0a 0a 20  OMEM, pData);.. 
1bfc0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75       /* Write ou
1bfd0 74 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e  t the page data.
1bfe0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
1bff0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
1c000 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c  ager->fd, pData,
1c010 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1c020 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20  e, offset);..   
1c030 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20     /* If page 1 
1c040 77 61 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e  was just written
1c050 2c 20 75 70 64 61 74 65 20 50 61 67 65 72 2e 64  , update Pager.d
1c060 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74  bFileVers to mat
1c070 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ch.      ** the 
1c080 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64  value now stored
1c090 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1c0a0 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e   file. If writin
1c0b0 67 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a  g this .      **
1c0c0 20 70 61 67 65 20 63 61 75 73 65 64 20 74 68 65   page caused the
1c0d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1c0e0 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64  o grow, update d
1c0f0 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20  bFileSize. .    
1c100 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
1c110 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
1c120 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
1c130 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70  ->dbFileVers, &p
1c140 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66  Data[24], sizeof
1c150 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1c160 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ers));.      }. 
1c170 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50       if( pgno>pP
1c180 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
1c190 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
1c1a0 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
1c1b0 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a   pgno;.      }..
1c1c0 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
1c1d0 61 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65 63  any backup objec
1c1e0 74 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63  ts copying the c
1c1f0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20  ontents of this 
1c200 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  pager. */.      
1c210 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
1c220 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
1c230 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29  kup, pgno, (u8*)
1c240 70 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a  pList->pData);..
1c250 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1c260 28 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65  (("STORE %d page
1c270 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
1c280 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1c290 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
1c2a0 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67  ager), pgno, pag
1c2b0 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73  er_pagehash(pLis
1c2c0 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  t)));.      IOTR
1c2d0 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25  ACE(("PGOUT %p %
1c2e0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
1c2f0 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45  no));.      PAGE
1c300 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
1c310 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
1c320 6e 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  nt);.      PAGER
1c330 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57  _INCR(pPager->nW
1c340 72 69 74 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  rite);.    }else
1c350 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  {.      PAGERTRA
1c360 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20  CE(("NOSTORE %d 
1c370 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
1c380 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
1c390 6f 29 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  o));.    }.#ifde
1c3a0 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
1c3b0 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e  AGES.    pList->
1c3c0 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
1c3d0 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
1c3e0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69  ;.#endif.    pLi
1c3f0 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  st = pList->pDir
1c400 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ty;.  }..  retur
1c410 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1c420 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f  ppend a record o
1c430 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  f the current st
1c440 61 74 65 20 6f 66 20 70 61 67 65 20 70 50 67 20  ate of page pPg 
1c450 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
1c460 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74 68  al. .** It is th
1c470 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e  e callers respon
1c480 73 69 62 69 6c 69 74 79 20 74 6f 20 75 73 65 20  sibility to use 
1c490 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
1c4a0 28 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a 20  () to check .** 
1c4b0 74 68 61 74 20 69 74 20 69 73 20 72 65 61 6c 6c  that it is reall
1c4c0 79 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  y required befor
1c4d0 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  e calling this f
1c4e0 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
1c4f0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
1c500 74 20 74 68 65 20 62 69 74 20 63 6f 72 72 65 73  t the bit corres
1c510 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e  ponding to pPg->
1c520 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76  pgno in the bitv
1c530 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f  ecs.** for all o
1c540 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62  pen savepoints b
1c550 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
1c560 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
1c570 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
1c580 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
1c590 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
1c5a0 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72  ul, an IO.** err
1c5b0 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20 61  or code if the a
1c5c0 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
1c5d0 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
1c5e0 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
1c5f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
1c600 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20   a malloc fails 
1c610 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20  while setting a 
1c620 62 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69  bit in a savepoi
1c630 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f  nt.** bitvec..*/
1c640 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
1c650 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72  ournalPage(PgHdr
1c660 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63   *pPg){.  int rc
1c670 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1c680 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1c690 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
1c6a0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
1c6b0 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 76  ->sjfd) ){.    v
1c6c0 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67  oid *pData = pPg
1c6d0 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 69 36 34  ->pData;.    i64
1c6e0 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72   offset = pPager
1c6f0 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->nSubRec*(4+pPa
1c700 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1c710 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
1c720 3b 0a 0a 20 20 20 20 43 4f 44 45 43 32 28 70 50  ;..    CODEC2(pP
1c730 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
1c740 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72  ->pgno, 7, retur
1c750 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  n SQLITE_NOMEM, 
1c760 70 44 61 74 61 32 29 3b 0a 20 20 20 20 50 41 47  pData2);.    PAG
1c770 45 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a  ERTRACE(("STMT-J
1c780 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
1c790 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1c7a0 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
1c7b0 29 29 3b 0a 20 20 0a 20 20 20 20 61 73 73 65 72  ));.  .    asser
1c7c0 74 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  t( pageInJournal
1c7d0 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67  (pPg) || pPg->pg
1c7e0 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  no>pPager->dbOri
1c7f0 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 72 63 20  gSize );.    rc 
1c800 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
1c810 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73  ager->sjfd, offs
1c820 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  et, pPg->pgno);.
1c830 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c840 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1c850 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
1c860 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  te(pPager->sjfd,
1c870 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
1c880 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
1c890 74 2b 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  t+4);.    }.  }.
1c8a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c8b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
1c8c0 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20  r->nSubRec++;.  
1c8d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1c8e0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29  ->nSavepoint>0 )
1c8f0 3b 0a 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f  ;.    rc = addTo
1c900 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
1c910 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67  (pPager, pPg->pg
1c920 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  no);.  }.  retur
1c930 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1c940 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1c950 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
1c960 63 61 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e  cache layer when
1c970 20 69 74 20 68 61 73 20 72 65 61 63 68 65 64 20   it has reached 
1c980 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d  some.** soft mem
1c990 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66  ory limit. The f
1c9a0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
1c9b0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
1c9c0 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20  Pager object.** 
1c9d0 28 63 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a  (cast as a void*
1c9e0 29 2e 20 54 68 65 20 70 61 67 65 72 20 69 73 20  ). The pager is 
1c9f0 61 6c 77 61 79 73 20 27 70 75 72 67 65 61 62 6c  always 'purgeabl
1ca00 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65  e' (not an in-me
1ca10 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65  mory.** database
1ca20 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ). The second ar
1ca30 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65  gument is a refe
1ca40 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20  rence to a page 
1ca50 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72  that is .** curr
1ca60 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74 20  ently dirty but 
1ca70 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  has no outstandi
1ca80 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54  ng references. T
1ca90 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c  he page.** is al
1caa0 77 61 79 73 20 61 73 73 6f 63 69 61 74 65 64 20  ways associated 
1cab0 77 69 74 68 20 74 68 65 20 50 61 67 65 72 20 6f  with the Pager o
1cac0 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
1cad0 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72  the first .** ar
1cae0 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  gument..**.** Th
1caf0 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75  e job of this fu
1cb00 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b  nction is to mak
1cb10 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77  e pPg clean by w
1cb20 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65  riting its conte
1cb30 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68  nts.** out to th
1cb40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
1cb50 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68   if possible. Th
1cb60 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73  is may involve s
1cb70 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f  yncing the.** jo
1cb80 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a  urnal file. .**.
1cb90 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
1cba0 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  , sqlite3PcacheM
1cbb0 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61  akeClean() is ca
1cbc0 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65  lled on the page
1cbd0 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f   and.** SQLITE_O
1cbe0 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  K returned. If a
1cbf0 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
1cc00 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
1cc10 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61  o make the.** pa
1cc20 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f  ge clean, the IO
1cc30 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1cc40 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20  eturned. If the 
1cc50 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  page cannot be.*
1cc60 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72  * made clean for
1cc70 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73   some other reas
1cc80 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  on, but no error
1cc90 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51   occurs, then SQ
1cca0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
1ccb0 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
1ccc0 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
1ccd0 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  () is not called
1cce0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ccf0 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69 64  pagerStress(void
1cd00 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29   *p, PgHdr *pPg)
1cd10 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
1cd20 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a  r = (Pager *)p;.
1cd30 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1cd40 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
1cd50 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
1cd60 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  ager );.  assert
1cd70 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
1cd80 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f  DR_DIRTY );..  /
1cd90 2a 20 54 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20  * The doNotSync 
1cda0 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20 74  flag is set by t
1cdb0 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  he sqlite3PagerW
1cdc0 72 69 74 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  rite() function 
1cdd0 77 68 69 6c 65 20 69 74 0a 20 20 2a 2a 20 69 73  while it.  ** is
1cde0 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 61 20 73   journalling a s
1cdf0 65 74 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  et of two or mor
1ce00 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73  e database pages
1ce10 20 74 68 61 74 20 61 72 65 20 73 74 6f 72 65 64   that are stored
1ce20 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 61 6d  .  ** on the sam
1ce30 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53  e disk sector. S
1ce40 79 6e 63 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  yncing the journ
1ce50 61 6c 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  al is not allowe
1ce60 64 20 77 68 69 6c 65 0a 20 20 2a 2a 20 74 68 69  d while.  ** thi
1ce70 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61  s is happening a
1ce80 73 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  s it is importan
1ce90 74 20 74 68 61 74 20 61 6c 6c 20 6d 65 6d 62 65  t that all membe
1cea0 72 73 20 6f 66 20 73 75 63 68 20 61 0a 20 20 2a  rs of such a.  *
1ceb0 2a 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 61  * set of pages a
1cec0 72 65 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  re synced to dis
1ced0 6b 20 74 6f 67 65 74 68 65 72 2e 20 53 6f 2c 20  k together. So, 
1cee0 69 66 20 74 68 65 20 70 61 67 65 20 74 68 69 73  if the page this
1cef0 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69   function.  ** i
1cf00 73 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65  s trying to make
1cf10 20 63 6c 65 61 6e 20 77 69 6c 6c 20 72 65 71 75   clean will requ
1cf20 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79  ire a journal sy
1cf30 6e 63 20 61 6e 64 20 74 68 65 20 64 6f 4e 6f 74  nc and the doNot
1cf40 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 69  Sync.  ** flag i
1cf50 73 20 73 65 74 2c 20 72 65 74 75 72 6e 20 77 69  s set, return wi
1cf60 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
1cf70 68 69 6e 67 2e 20 54 68 65 20 70 63 61 63 68 65  hing. The pcache
1cf80 20 6c 61 79 65 72 20 77 69 6c 6c 0a 20 20 2a 2a   layer will.  **
1cf90 20 6a 75 73 74 20 68 61 76 65 20 74 6f 20 67 6f   just have to go
1cfa0 20 61 68 65 61 64 20 61 6e 64 20 61 6c 6c 6f 63   ahead and alloc
1cfb0 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 62  ate a new page b
1cfc0 75 66 66 65 72 20 69 6e 73 74 65 61 64 20 6f 66  uffer instead of
1cfd0 0a 20 20 2a 2a 20 72 65 75 73 69 6e 67 20 70 50  .  ** reusing pP
1cfe0 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 69 6d  g..  **.  ** Sim
1cff0 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 70  ilarly, if the p
1d000 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ager has already
1d010 20 65 6e 74 65 72 65 64 20 74 68 65 20 65 72 72   entered the err
1d020 6f 72 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74  or state, do not
1d030 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 77 72 69  .  ** try to wri
1d040 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
1d050 6f 66 20 70 50 67 20 74 6f 20 64 69 73 6b 2e 0a  of pPg to disk..
1d060 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52    */.  if( NEVER
1d070 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
1d080 29 0a 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d  ).   || (pPager-
1d090 3e 64 6f 4e 6f 74 53 79 6e 63 20 26 26 20 70 50  >doNotSync && pP
1d0a0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
1d0b0 45 45 44 5f 53 59 4e 43 29 0a 20 20 29 7b 0a 20  EED_SYNC).  ){. 
1d0c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1d0d0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  _OK;.  }..  /* S
1d0e0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
1d0f0 66 69 6c 65 20 69 66 20 72 65 71 75 69 72 65 64  file if required
1d100 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e  . */.  if( pPg->
1d110 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
1d120 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 72 63 20  _SYNC ){.    rc 
1d130 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
1d140 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
1d150 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1d160 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
1d170 20 26 26 20 0a 20 20 20 20 20 20 21 28 70 50 61   && .      !(pPa
1d180 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
1d190 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
1d1a0 4f 44 45 5f 4d 45 4d 4f 52 59 29 20 26 26 0a 20  ODE_MEMORY) &&. 
1d1b0 20 20 20 20 20 21 28 73 71 6c 69 74 65 33 4f 73       !(sqlite3Os
1d1c0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1d1d0 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
1d1e0 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
1d1f0 41 46 45 5f 41 50 50 45 4e 44 29 0a 20 20 20 20  AFE_APPEND).    
1d200 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
1d210 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
1d220 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
1d230 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
1d240 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
1d250 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  f the page numbe
1d260 72 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 69  r of this page i
1d270 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
1d280 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
1d290 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62  f.  ** the datab
1d2a0 61 73 65 20 69 6d 61 67 65 2c 20 69 74 20 6d 61  ase image, it ma
1d2b0 79 20 6e 65 65 64 20 74 6f 20 62 65 20 77 72 69  y need to be wri
1d2c0 74 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d  tten to the sub-
1d2d0 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 20 54 68  journal..  ** Th
1d2e0 69 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68  is is because th
1d2f0 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  e call to pager_
1d300 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29  write_pagelist()
1d310 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a   below will not.
1d320 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72    ** actually wr
1d330 69 74 65 20 64 61 74 61 20 74 6f 20 74 68 65 20  ite data to the 
1d340 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73  file in this cas
1d350 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e  e..  **.  ** Con
1d360 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
1d370 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ing sequence of 
1d380 65 76 65 6e 74 73 3a 0a 20 20 2a 2a 0a 20 20 2a  events:.  **.  *
1d390 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20  *   BEGIN;.  ** 
1d3a0 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67      <journal pag
1d3b0 65 20 58 3e 0a 20 20 2a 2a 20 20 20 20 20 3c 6d  e X>.  **     <m
1d3c0 6f 64 69 66 79 20 70 61 67 65 20 58 3e 0a 20 20  odify page X>.  
1d3d0 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54  **     SAVEPOINT
1d3e0 20 73 70 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20   sp;.  **       
1d3f0 3c 73 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65  <shrink database
1d400 20 66 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73   file to Y pages
1d410 3e 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67  >.  **       pag
1d420 65 72 53 74 72 65 73 73 28 70 61 67 65 20 58 29  erStress(page X)
1d430 0a 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41  .  **     ROLLBA
1d440 43 4b 20 54 4f 20 73 70 3b 0a 20 20 2a 2a 0a 20  CK TO sp;.  **. 
1d450 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68   ** If (X>Y), th
1d460 65 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74 72  en when pagerStr
1d470 65 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61  ess is called pa
1d480 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ge X will not be
1d490 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 6f 75   written.  ** ou
1d4a0 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
1d4b0 65 20 66 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c  e file, but will
1d4c0 20 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d   be dropped from
1d4d0 20 74 68 65 20 63 61 63 68 65 2e 20 54 68 65 6e   the cache. Then
1d4e0 2c 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  ,.  ** following
1d4f0 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54   the "ROLLBACK T
1d500 4f 20 73 70 22 20 73 74 61 74 65 6d 65 6e 74 2c  O sp" statement,
1d510 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 58 20   reading page X 
1d520 77 69 6c 6c 20 72 65 61 64 0a 20 20 2a 2a 20 64  will read.  ** d
1d530 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ata from the dat
1d540 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73  abase file. This
1d550 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70   will be the cop
1d560 79 20 6f 66 20 70 61 67 65 20 58 20 61 73 20 69  y of page X as i
1d570 74 0a 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20  t.  ** was when 
1d580 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1d590 73 74 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20  started, not as 
1d5a0 69 74 20 77 61 73 20 77 68 65 6e 20 22 53 41 56  it was when "SAV
1d5b0 45 50 4f 49 4e 54 20 73 70 22 0a 20 20 2a 2a 20  EPOINT sp".  ** 
1d5c0 77 61 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20  was executed..  
1d5d0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75  **.  ** The solu
1d5e0 74 69 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65  tion is to write
1d5f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74   the current dat
1d600 61 20 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74  a for page X int
1d610 6f 20 74 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d  o the .  ** sub-
1d620 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77  journal file now
1d630 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
1d640 6c 72 65 61 64 79 20 74 68 65 72 65 29 2c 20 73  lready there), s
1d650 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20  o that it will. 
1d660 20 2a 2a 20 62 65 20 72 65 73 74 6f 72 65 64 20   ** be restored 
1d670 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 76  to its current v
1d680 61 6c 75 65 20 77 68 65 6e 20 74 68 65 20 22 52  alue when the "R
1d690 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 69  OLLBACK TO sp" i
1d6a0 73 20 0a 20 20 2a 2a 20 65 78 65 63 75 74 65 64  s .  ** executed
1d6b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ..  */.  if( NEV
1d6c0 45 52 28 0a 20 20 20 20 20 20 72 63 3d 3d 53 51  ER(.      rc==SQ
1d6d0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e  LITE_OK && pPg->
1d6e0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53  pgno>pPager->dbS
1d6f0 69 7a 65 20 26 26 20 73 75 62 6a 52 65 71 75 69  ize && subjRequi
1d700 72 65 73 50 61 67 65 28 70 50 67 29 0a 20 20 29  resPage(pPg).  )
1d710 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 75 62   ){.    rc = sub
1d720 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29  journalPage(pPg)
1d730 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74  ;.  }..  /* Writ
1d740 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
1d750 66 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74  f the page out t
1d760 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1d770 69 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  ile. */.  if( rc
1d780 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d790 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d     pPg->pDirty =
1d7a0 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   0;.    rc = pag
1d7b0 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
1d7c0 74 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f  t(pPg);.  }..  /
1d7d0 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
1d7e0 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69  as clean. */.  i
1d7f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d800 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41   ){.    PAGERTRA
1d810 43 45 28 28 22 53 54 52 45 53 53 20 25 64 20 70  CE(("STRESS %d p
1d820 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
1d830 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
1d840 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c  >pgno));.    sql
1d850 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
1d860 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  ean(pPg);.  }.. 
1d870 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
1d880 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
1d890 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  .}.../*.** Alloc
1d8a0 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
1d8b0 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f  ze a new Pager o
1d8c0 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61 20  bject and put a 
1d8d0 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a  pointer to it.**
1d8e0 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68   in *ppPager. Th
1d8f0 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65  e pager should e
1d900 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65  ventually be fre
1d910 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 69 74  ed by passing it
1d920 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61  .** to sqlite3Pa
1d930 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a  gerClose()..**.*
1d940 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  * The zFilename 
1d950 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
1d960 70 61 74 68 20 74 6f 20 74 68 65 20 64 61 74 61  path to the data
1d970 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
1d980 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  n..** If zFilena
1d990 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  me is NULL then 
1d9a0 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64  a randomly-named
1d9b0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
1d9c0 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
1d9d0 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69  d used as the fi
1d9e0 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e  le to be cached.
1d9f0 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   Temporary files
1da00 20 61 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a   are be deleted.
1da10 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
1da20 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 63   when they are c
1da30 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e  losed. If zFilen
1da40 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
1da50 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69  " then .** all i
1da60 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65  nformation is he
1da70 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20  ld in cache. It 
1da80 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
1da90 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68   to disk. .** Th
1daa0 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  is can be used t
1dab0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69  o implement an i
1dac0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1dad0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78  e..**.** The nEx
1dae0 74 72 61 20 70 61 72 61 6d 65 74 65 72 20 73 70  tra parameter sp
1daf0 65 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62  ecifies the numb
1db00 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
1db10 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  pace allocated.*
1db20 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63  * along with eac
1db30 68 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  h page reference
1db40 2e 20 54 68 69 73 20 73 70 61 63 65 20 69 73 20  . This space is 
1db50 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65  available to the
1db60 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65   user.** via the
1db70 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1db80 45 78 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a  Extra() API..**.
1db90 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72 67  ** The flags arg
1dba0 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f  ument is used to
1dbb0 20 73 70 65 63 69 66 79 20 70 72 6f 70 65 72 74   specify propert
1dbc0 69 65 73 20 74 68 61 74 20 61 66 66 65 63 74 20  ies that affect 
1dbd0 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  the.** operation
1dbe0 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 20 49   of the pager. I
1dbf0 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73  t should be pass
1dc00 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20  ed some bitwise 
1dc10 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f  combination.** o
1dc20 66 20 74 68 65 20 50 41 47 45 52 5f 4f 4d 49 54  f the PAGER_OMIT
1dc30 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 50 41 47  _JOURNAL and PAG
1dc40 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66  ER_NO_READLOCK f
1dc50 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lags..**.** The 
1dc60 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74  vfsFlags paramet
1dc70 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20  er is a bitmask 
1dc80 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20 66  to pass to the f
1dc90 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a  lags parameter.*
1dca0 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29  * of the xOpen()
1dcb0 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73   method of the s
1dcc0 75 70 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e  upplied VFS when
1dcd0 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20   opening files. 
1dce0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
1dcf0 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  ger object is al
1dd00 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
1dd10 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f  specified file o
1dd20 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73  pened .** succes
1dd30 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f  sfully, SQLITE_O
1dd40 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  K is returned an
1dd50 64 20 2a 70 70 50 61 67 65 72 20 73 65 74 20 74  d *ppPager set t
1dd60 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68  o point to.** th
1dd70 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65  e new pager obje
1dd80 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ct. If an error 
1dd90 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72  occurs, *ppPager
1dda0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a   is set to NULL.
1ddb0 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64  ** and error cod
1ddc0 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  e returned. This
1ddd0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65   function may re
1dde0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1ddf0 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c  M.** (sqlite3Mal
1de00 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20 74 6f  loc() is used to
1de10 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
1de20 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  ), SQLITE_CANTOP
1de30 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75  EN or .** variou
1de40 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20  s SQLITE_IO_XXX 
1de50 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  errors..*/.int s
1de60 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
1de70 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1de80 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54  pVfs,       /* T
1de90 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20  he virtual file 
1dea0 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f  system to use */
1deb0 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67  .  Pager **ppPag
1dec0 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  er,         /* O
1ded0 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50  UT: Return the P
1dee0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68  ager structure h
1def0 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
1df00 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
1df10 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1df20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1df30 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
1df40 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  nExtra,         
1df50 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79       /* Extra by
1df60 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61  tes append to ea
1df70 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
1df80 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
1df90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1dfa0 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c  /* flags control
1dfb0 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a  ling this file *
1dfc0 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
1dfd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1dfe0 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  flags passed thr
1dff0 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
1e000 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20  vfs.xOpen() */. 
1e010 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29   void (*xReinit)
1e020 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e  (DbPage*) /* Fun
1e030 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69  ction to reiniti
1e040 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29  alize pages */.)
1e050 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20  {.  u8 *pPtr;.  
1e060 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1e070 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  0;       /* Page
1e080 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f  r object to allo
1e090 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  cate and return 
1e0a0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
1e0b0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a  LITE_OK;      /*
1e0c0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1e0d0 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d    int tempFile =
1e0e0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
1e0f0 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65  ue for temp file
1e100 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f  s (incl. in-memo
1e110 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69  ry files) */.  i
1e120 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20  nt memDb = 0;   
1e130 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1e140 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  if this is an in
1e150 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
1e160 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d    int readOnly =
1e170 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
1e180 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
1e190 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a  read-only file *
1e1a0 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46  /.  int journalF
1e1b0 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20  ileSize;     /* 
1e1c0 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74  Bytes to allocat
1e1d0 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e  e for each journ
1e1e0 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20  al fd */.  char 
1e1f0 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20  *zPathname = 0; 
1e200 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68      /* Full path
1e210 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c   to database fil
1e220 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68  e */.  int nPath
1e230 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  name = 0;       
1e240 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1e250 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20  es in zPathname 
1e260 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72  */.  int useJour
1e270 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50  nal = (flags & P
1e280 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  AGER_OMIT_JOURNA
1e290 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20  L)==0; /* False 
1e2a0 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20  to omit journal 
1e2b0 2a 2f 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c  */.  int noReadl
1e2c0 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50  ock = (flags & P
1e2d0 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  AGER_NO_READLOCK
1e2e0 29 21 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74  )!=0;  /* True t
1e2f0 6f 20 6f 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b  o omit read-lock
1e300 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65   */.  int pcache
1e310 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63  Size = sqlite3Pc
1e320 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20  acheSize();     
1e330 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
1e340 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63 68  locate for PCach
1e350 65 20 2a 2f 0a 20 20 75 31 36 20 73 7a 50 61 67  e */.  u16 szPag
1e360 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44  eDflt = SQLITE_D
1e370 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
1e380 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61  ;  /* Default pa
1e390 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 2f 2a  ge size */..  /*
1e3a0 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
1e3b0 6d 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65  much space is re
1e3c0 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20  quired for each 
1e3d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e  journal file-han
1e3e0 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20  dle.  ** (there 
1e3f0 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c  are two of them,
1e400 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
1e410 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f  l and the sub-jo
1e420 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a  urnal). This.  *
1e430 2a 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  * is the maximum
1e440 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
1e450 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
1e460 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
1e470 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61  ndle .  ** and a
1e480 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c   regular journal
1e490 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f   file-handle. No
1e4a0 74 65 20 74 68 61 74 20 61 20 22 72 65 67 75 6c  te that a "regul
1e4b0 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c  ar journal-handl
1e4c0 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61  e".  ** may be a
1e4d0 20 77 72 61 70 70 65 72 20 63 61 70 61 62 6c 65   wrapper capable
1e4e0 20 6f 66 20 63 61 63 68 69 6e 67 20 74 68 65 20   of caching the 
1e4f0 66 69 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66  first portion of
1e500 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
1e510 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79  * file in memory
1e520 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
1e530 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
1e540 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65  ptimization (see
1e550 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69   .  ** source fi
1e560 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20  le journal.c).. 
1e570 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
1e580 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
1e590 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75  s)>sqlite3MemJou
1e5a0 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20  rnalSize() ){.  
1e5b0 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
1e5c0 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74  e = ROUND8(sqlit
1e5d0 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56  e3JournalSize(pV
1e5e0 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fs));.  }else{. 
1e5f0 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
1e600 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69  ze = ROUND8(sqli
1e610 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a  te3MemJournalSiz
1e620 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e());.  }..  /* 
1e630 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76  Set the output v
1e640 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20  ariable to NULL 
1e650 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72  in case an error
1e660 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70   occurs. */.  *p
1e670 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f  pPager = 0;..  /
1e680 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74  * Compute and st
1e690 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74  ore the full pat
1e6a0 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f  hname in an allo
1e6b0 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f 69  cated buffer poi
1e6c0 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20  nted.  ** to by 
1e6d0 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74  zPathname, lengt
1e6e0 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c  h nPathname. Or,
1e6f0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74 65   if this is a te
1e700 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20  mporary file,.  
1e710 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50  ** leave both nP
1e720 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74  athname and zPat
1e730 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a  hname set to 0..
1e740 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
1e750 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
1e760 65 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74  e[0] ){.    nPat
1e770 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
1e780 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
1e790 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  zPathname = sqli
1e7a0 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e  te3Malloc(nPathn
1e7b0 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20  ame*2);.    if( 
1e7c0 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a  zPathname==0 ){.
1e7d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e7e0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
1e7f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e800 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
1e810 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69    if( strcmp(zFi
1e820 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a  lename,":memory:
1e830 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  ")==0 ){.      m
1e840 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20  emDb = 1;.      
1e850 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30  zPathname[0] = 0
1e860 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
1e870 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a  if.    {.      z
1e880 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b  Pathname[0] = 0;
1e890 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e   /* Make sure in
1e8a0 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69  itialized even i
1e8b0 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29  f FullPathname()
1e8c0 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20   fails */.      
1e8d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  rc = sqlite3OsFu
1e8e0 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
1e8f0 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74   zFilename, nPat
1e900 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  hname, zPathname
1e910 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 50  );.    }..    nP
1e920 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
1e930 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e  3Strlen30(zPathn
1e940 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
1e950 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
1e960 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d  Pathname+8>pVfs-
1e970 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  >mxPathname ){. 
1e980 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
1e990 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
1e9a0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  n the journal pa
1e9b0 74 68 20 72 65 71 75 69 72 65 64 20 62 79 0a 20  th required by. 
1e9c0 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
1e9d0 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  base being opene
1e9e0 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74  d will be more t
1e9f0 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  han pVfs->mxPath
1ea00 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79  name.      ** by
1ea10 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54  tes in length. T
1ea20 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61  his means the da
1ea30 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65  tabase cannot be
1ea40 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a   opened,.      *
1ea50 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74  * as it will not
1ea60 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
1ea70 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  open the journal
1ea80 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20   file or even.  
1ea90 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72      ** check for
1eaa0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62   a hot-journal b
1eab0 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20  efore reading.. 
1eac0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
1ead0 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
1eae0 45 4e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  EN;.    }.    if
1eaf0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1eb00 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1eb10 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
1eb20 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1eb30 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
1eb40 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
1eb50 72 79 20 66 6f 72 20 74 68 65 20 50 61 67 65 72  ry for the Pager
1eb60 20 73 74 72 75 63 74 75 72 65 2c 20 50 43 61 63   structure, PCac
1eb70 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20  he object, the. 
1eb80 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64   ** three file d
1eb90 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20  escriptors, the 
1eba0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
1ebb0 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  me and the journ
1ebc0 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61  al .  ** file na
1ebd0 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69  me. The layout i
1ebe0 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66  n memory is as f
1ebf0 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
1ec00 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65  *     Pager obje
1ec10 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
1ec20 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61        (sizeof(Pa
1ec30 67 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a  ger) bytes).  **
1ec40 20 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65       PCache obje
1ec50 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
1ec60 20 20 20 20 20 28 73 71 6c 69 74 65 33 50 63 61       (sqlite3Pca
1ec70 63 68 65 53 69 7a 65 28 29 20 62 79 74 65 73 29  cheSize() bytes)
1ec80 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61  .  **     Databa
1ec90 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  se file handle  
1eca0 20 20 20 20 20 20 20 20 20 20 28 70 56 66 73 2d            (pVfs-
1ecb0 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29  >szOsFile bytes)
1ecc0 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f  .  **     Sub-jo
1ecd0 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
1ece0 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e  e         (journ
1ecf0 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73  alFileSize bytes
1ed00 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20  ).  **     Main 
1ed10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
1ed20 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72  dle        (jour
1ed30 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65  nalFileSize byte
1ed40 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61  s).  **     Data
1ed50 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20  base file name  
1ed60 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61              (nPa
1ed70 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a  thname+1 bytes).
1ed80 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c    **     Journal
1ed90 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20   file name      
1eda0 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e           (nPathn
1edb0 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20  ame+8+1 bytes). 
1edc0 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38   */.  pPtr = (u8
1edd0 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
1ede0 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38  Zero(.    ROUND8
1edf0 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29  (sizeof(*pPager)
1ee00 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65  ) +      /* Page
1ee10 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  r structure */. 
1ee20 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65     ROUND8(pcache
1ee30 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20  Size) +         
1ee40 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65    /* PCache obje
1ee50 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38  ct */.    ROUND8
1ee60 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29  (pVfs->szOsFile)
1ee70 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20   +       /* The 
1ee80 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a  main db file */.
1ee90 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
1eea0 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20  ize * 2 +       
1eeb0 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f     /* The two jo
1eec0 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a  urnal files */ .
1eed0 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
1eee0 31 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  1 +             
1eef0 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
1ef00 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  */.    nPathname
1ef10 20 2b 20 38 20 2b 20 31 20 20 20 20 20 20 20 20   + 8 + 1        
1ef20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61        /* zJourna
1ef30 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20 61 73 73 65  l */.  );.  asse
1ef40 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
1ef50 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f  LIGNMENT(SQLITE_
1ef60 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e  INT_TO_PTR(journ
1ef70 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a  alFileSize)) );.
1ef80 20 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20    if( !pPtr ){. 
1ef90 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1efa0 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
1efb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1efc0 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  MEM;.  }.  pPage
1efd0 72 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20  r =             
1efe0 20 28 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b   (Pager*)(pPtr);
1eff0 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  .  pPager->pPCac
1f000 68 65 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a  he =    (PCache*
1f010 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
1f020 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29  (sizeof(*pPager)
1f030 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64  ));.  pPager->fd
1f040 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69   =   (sqlite3_fi
1f050 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  le*)(pPtr += ROU
1f060 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 29  ND8(pcacheSize))
1f070 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  ;.  pPager->sjfd
1f080 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
1f090 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
1f0a0 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  8(pVfs->szOsFile
1f0b0 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66  ));.  pPager->jf
1f0c0 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69  d =  (sqlite3_fi
1f0d0 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75  le*)(pPtr += jou
1f0e0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20  rnalFileSize);. 
1f0f0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
1f100 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28  me =    (char*)(
1f110 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46  pPtr += journalF
1f120 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65  ileSize);.  asse
1f130 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
1f140 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d  LIGNMENT(pPager-
1f150 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46  >jfd) );..  /* F
1f160 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72  ill in the Pager
1f170 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50  .zFilename and P
1f180 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75  ager.zJournal bu
1f190 66 66 65 72 73 2c 20 69 66 20 72 65 71 75 69 72  ffers, if requir
1f1a0 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61  ed. */.  if( zPa
1f1b0 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 70 50  thname ){.    pP
1f1c0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d  ager->zJournal =
1f1d0 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20     (char*)(pPtr 
1f1e0 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31  += nPathname + 1
1f1f0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  );.    memcpy(pP
1f200 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
1f210 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
1f220 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63  hname);.    memc
1f230 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  py(pPager->zJour
1f240 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  nal, zPathname, 
1f250 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
1f260 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
1f270 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
1f280 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c  me], "-journal",
1f290 20 38 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61   8);.    if( pPa
1f2a0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30  ger->zFilename[0
1f2b0 5d 3d 3d 30 20 29 20 70 50 61 67 65 72 2d 3e 7a  ]==0 ) pPager->z
1f2c0 4a 6f 75 72 6e 61 6c 5b 30 5d 20 3d 20 30 3b 0a  Journal[0] = 0;.
1f2d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1f2e0 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d  (zPathname);.  }
1f2f0 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20  .  pPager->pVfs 
1f300 3d 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72  = pVfs;.  pPager
1f310 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73  ->vfsFlags = vfs
1f320 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65  Flags;..  /* Ope
1f330 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
1f340 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
1f350 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
1f360 61 6d 65 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62  ame[0] && !memDb
1f370 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74   ){.    int fout
1f380 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1f390 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20           /* VFS 
1f3a0 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62  flags returned b
1f3b0 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20  y xOpen() */.   
1f3c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
1f3d0 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
1f3e0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61  ->zFilename, pPa
1f3f0 67 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67  ger->fd, vfsFlag
1f400 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 72  s, &fout);.    r
1f410 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26  eadOnly = (fout&
1f420 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1f430 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ONLY);..    /* I
1f440 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73  f the file was s
1f450 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
1f460 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  ed for read/writ
1f470 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a  e access,.    **
1f480 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c   choose a defaul
1f490 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63  t page size in c
1f4a0 61 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63  ase we have to c
1f4b0 72 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  reate the.    **
1f4c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1f4d0 54 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  The default page
1f4e0 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78   size is the max
1f4f0 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  imum of:.    **.
1f500 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49      **    + SQLI
1f510 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
1f520 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20  SIZE,.    **    
1f530 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  + The value retu
1f540 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f  rned by sqlite3O
1f550 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20  sSectorSize().  
1f560 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61    **    + The la
1f570 72 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20  rgest page size 
1f580 74 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74  that can be writ
1f590 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a  ten atomically..
1f5a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
1f5b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1f5c0 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  !readOnly ){.   
1f5d0 20 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65     setSectorSize
1f5e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1f5f0 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45  assert(SQLITE_DE
1f600 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c  FAULT_PAGE_SIZE<
1f610 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  =SQLITE_MAX_DEFA
1f620 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ULT_PAGE_SIZE);.
1f630 20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65        if( szPage
1f640 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63  Dflt<pPager->sec
1f650 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  torSize ){.     
1f660 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
1f670 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45  ectorSize>SQLITE
1f680 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
1f690 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20  E_SIZE ){.      
1f6a0 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
1f6b0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41   SQLITE_MAX_DEFA
1f6c0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ULT_PAGE_SIZE;. 
1f6d0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1f6e0 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
1f6f0 6c 74 20 3d 20 28 75 31 36 29 70 50 61 67 65 72  lt = (u16)pPager
1f700 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20  ->sectorSize;.  
1f710 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1f720 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1f730 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
1f740 45 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  E.      {.      
1f750 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69    int iDc = sqli
1f760 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
1f770 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
1f780 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20  r->fd);.        
1f790 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20  int ii;.        
1f7a0 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
1f7b0 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
1f7c0 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  512>>8));.      
1f7d0 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
1f7e0 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d  IOCAP_ATOMIC64K=
1f7f0 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20  =(65536>>8));.  
1f800 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
1f810 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
1f820 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36  PAGE_SIZE<=65536
1f830 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
1f840 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69  i=szPageDflt; ii
1f850 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  <=SQLITE_MAX_DEF
1f860 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20  AULT_PAGE_SIZE; 
1f870 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20  ii=ii*2){.      
1f880 20 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c      if( iDc&(SQL
1f890 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
1f8a0 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20  |(ii>>8)) ){.   
1f8b0 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
1f8c0 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20  flt = ii;.      
1f8d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1f8e0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1f8f0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1f900 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72    /* If a tempor
1f910 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75  ary file is requ
1f920 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74  ested, it is not
1f930 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74   opened immediat
1f940 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  ely..    ** In t
1f950 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65  his case we acce
1f960 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  pt the default p
1f970 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c  age size and del
1f980 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20  ay actually.    
1f990 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66  ** opening the f
1f9a0 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69  ile until the fi
1f9b0 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72  rst call to OsWr
1f9c0 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ite()..    **.  
1f9d0 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68    ** This branch
1f9e0 20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72   is also run for
1f9f0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
1fa00 74 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65  tabase. An in-me
1fa10 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61  mory.    ** data
1fa20 62 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65  base is the same
1fa30 20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   as a temp-file 
1fa40 74 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72  that is never wr
1fa50 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20  itten out to.   
1fa60 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65   ** disk and use
1fa70 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72  s an in-memory r
1fa80 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
1fa90 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d  .    */ .    tem
1faa0 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70  pFile = 1;.    p
1fab0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
1fac0 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
1fad0 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28      readOnly = (
1fae0 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  vfsFlags&SQLITE_
1faf0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
1fb00 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
1fb10 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20  llowing call to 
1fb20 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
1fb30 28 29 20 73 65 72 76 65 73 20 74 6f 20 73 65 74  () serves to set
1fb40 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20   the value of . 
1fb50 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   ** Pager.pageSi
1fb60 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61  ze and to alloca
1fb70 74 65 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d  te the Pager.pTm
1fb80 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20  pSpace buffer.. 
1fb90 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
1fba0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
1fbb0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d  ssert( pPager->m
1fbc0 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72  emDb==0 );.    r
1fbd0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1fbe0 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67  SetPagesize(pPag
1fbf0 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c  er, &szPageDflt,
1fc00 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
1fc10 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
1fc20 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  K );.  }..  /* I
1fc30 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1fc40 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66  red in either of
1fc50 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76   the blocks abov
1fc60 65 2c 20 66 72 65 65 20 74 68 65 20 0a 20 20 2a  e, free the .  *
1fc70 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  * Pager structur
1fc80 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  e and close the 
1fc90 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
1fca0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1fcb0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
1fcc0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
1fcd0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   );.    sqlite3O
1fce0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
1fcf0 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  d);.    sqlite3_
1fd00 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  free(pPager);.  
1fd10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1fd20 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
1fd30 65 20 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a  e the PCache obj
1fd40 65 63 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ect. */.  assert
1fd50 28 20 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b  ( nExtra<1000 );
1fd60 0a 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e  .  nExtra = ROUN
1fd70 44 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 73 71  D8(nExtra);.  sq
1fd80 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28  lite3PcacheOpen(
1fd90 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74  szPageDflt, nExt
1fda0 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20  ra, !memDb,.    
1fdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdc0 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65  !memDb?pagerStre
1fdd0 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50  ss:0, (void *)pP
1fde0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50  ager, pPager->pP
1fdf0 43 61 63 68 65 29 3b 0a 0a 20 20 50 41 47 45 52  Cache);..  PAGER
1fe00 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20  TRACE(("OPEN %d 
1fe10 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c  %s\n", FILEHANDL
1fe20 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c  EID(pPager->fd),
1fe30 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
1fe40 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  me));.  IOTRACE(
1fe50 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c  ("OPEN %p %s\n",
1fe60 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
1fe70 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20  >zFilename))..  
1fe80 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
1fe90 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72  al = (u8)useJour
1fea0 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  nal;.  pPager->n
1feb0 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52  oReadlock = (noR
1fec0 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f  eadlock && readO
1fed0 6e 6c 79 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20  nly) ?1:0;.  /* 
1fee0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
1fef0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
1ff00 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1ff10 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
1ff20 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a  ger->nRef = 0; *
1ff30 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
1ff40 7a 65 56 61 6c 69 64 20 3d 20 28 75 38 29 6d 65  zeValid = (u8)me
1ff50 6d 44 62 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  mDb;.  /* pPager
1ff60 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20  ->stmtSize = 0; 
1ff70 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
1ff80 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a  stmtJSize = 0; *
1ff90 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
1ffa0 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Page = 0; */.  p
1ffb0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
1ffc0 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
1ffd0 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67  COUNT;.  /* pPag
1ffe0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
1fff0 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61  R_UNLOCK; */.  a
20000 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
20010 74 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c  tate == (tempFil
20020 65 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e ? PAGER_EXCLUS
20030 49 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f  IVE : PAGER_UNLO
20040 43 4b 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67  CK) );.  /* pPag
20050 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b  er->errMask = 0;
20060 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65   */.  pPager->te
20070 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d  mpFile = (u8)tem
20080 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28  pFile;.  assert(
20090 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
200a0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
200b0 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c  MAL .          |
200c0 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  | tempFile==PAGE
200d0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
200e0 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73  CLUSIVE );.  ass
200f0 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
20100 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
20110 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ==1 );.  pPager-
20120 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
20130 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a   (u8)tempFile; .
20140 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
20150 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67  CountDone = pPag
20160 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
20170 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20  pPager->memDb = 
20180 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61  (u8)memDb;.  pPa
20190 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  ger->readOnly = 
201a0 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20  (u8)readOnly;.  
201b0 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  /* pPager->needS
201c0 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 61 73  ync = 0; */.  as
201d0 73 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c  sert( useJournal
201e0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
201f0 46 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72  File );.  pPager
20200 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65  ->noSync = pPage
20210 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70  r->tempFile;.  p
20220 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
20230 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  = pPager->noSync
20240 20 3f 30 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d   ?0:1;.  pPager-
20250 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51  >sync_flags = SQ
20260 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
20270 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  ;.  /* pPager->p
20280 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  First = 0; */.  
20290 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
202a0 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a  tSynced = 0; */.
202b0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61    /* pPager->pLa
202c0 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  st = 0; */.  pPa
202d0 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75  ger->nExtra = (u
202e0 31 36 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61  16)nExtra;.  pPa
202f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
20300 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44  Limit = SQLITE_D
20310 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53  EFAULT_JOURNAL_S
20320 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73  IZE_LIMIT;.  ass
20330 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
20340 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46  er->fd) || tempF
20350 69 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74  ile );.  setSect
20360 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
20370 20 20 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61    if( !useJourna
20380 6c 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  l ){.    pPager-
20390 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
203a0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
203b0 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66  _OFF;.  }else if
203c0 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70  ( memDb ){.    p
203d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
203e0 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
203f0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20  ALMODE_MEMORY;. 
20400 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e   }.  /* pPager->
20410 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30  xBusyHandler = 0
20420 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
20430 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
20440 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  g = 0; */.  pPag
20450 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20  er->xReiniter = 
20460 78 52 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65  xReinit;.  /* me
20470 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61  mset(pPager->aHa
20480 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50  sh, 0, sizeof(pP
20490 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a  ager->aHash)); *
204a0 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70  /.  *ppPager = p
204b0 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  Pager;.  return 
204c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a  SQLITE_OK;.}....
204d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
204e0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ion is called af
204f0 74 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e  ter transitionin
20500 67 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c  g from PAGER_UNL
20510 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f  OCK to.** PAGER_
20520 53 48 41 52 45 44 20 73 74 61 74 65 2e 20 49 74  SHARED state. It
20530 20 74 65 73 74 73 20 69 66 20 74 68 65 72 65 20   tests if there 
20540 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  is a hot journal
20550 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74   present in.** t
20560 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66  he file-system f
20570 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
20580 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61  er. A hot journa
20590 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a  l is one that .*
205a0 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  * needs to be pl
205b0 61 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72  ayed back. Accor
205c0 64 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e  ding to this fun
205d0 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75  ction, a hot-jou
205e0 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69  rnal.** file exi
205f0 73 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  sts if the follo
20600 77 69 6e 67 20 63 72 69 74 65 72 69 61 20 61 72  wing criteria ar
20610 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  e met:.**.**   *
20620 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
20630 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  e exists in the 
20640 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64  file system, and
20650 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65  .**   * No proce
20660 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52  ss holds a RESER
20670 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  VED or greater l
20680 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
20690 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a  ase file, and.**
206a0 20 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73     * The databas
206b0 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73  e file itself is
206c0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20   greater than 0 
206d0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61  bytes in size, a
206e0 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69  nd.**   * The fi
206f0 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
20700 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
20710 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30  sts and is not 0
20720 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  x00..**.** If th
20730 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
20740 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
20750 69 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a  ile is 0 but a j
20760 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65  ournal file.** e
20770 78 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70  xists, that is p
20780 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a  robably an old j
20790 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72  ournal left over
207a0 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a   from a prior.**
207b0 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
207c0 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e  he same name. In
207d0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a   this case the j
207e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a  ournal file is.*
207f0 2a 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75  * just deleted u
20800 73 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a  sing OsDelete, *
20810 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74  pExists is set t
20820 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  o 0 and SQLITE_O
20830 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
20840 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
20850 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68  tine does not ch
20860 65 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20  eck if there is 
20870 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
20880 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20   filename.** at 
20890 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
208a0 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
208b0 2c 20 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65  , and that maste
208c0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  r journal file.*
208d0 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  * does not exist
208e0 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
208f0 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72  al file is not r
20900 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68  eally hot. In th
20910 69 73 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20  is.** case this 
20920 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
20930 75 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69  urn a false-posi
20940 74 69 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f  tive. The pager_
20950 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f  playback().** ro
20960 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f  utine will disco
20970 76 65 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ver that the jou
20980 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
20990 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20   really hot and 
209a0 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c  .** will not rol
209b0 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a  l it back. .**.*
209c0 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  * If a hot-journ
209d0 61 6c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64  al file is found
209e0 20 74 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69   to exist, *pExi
209f0 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 31 20  sts is set to 1 
20a00 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  and .** SQLITE_O
20a10 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e  K returned. If n
20a20 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  o hot-journal fi
20a30 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a  le is present, *
20a40 70 45 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65  pExists is.** se
20a50 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
20a60 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
20a70 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
20a80 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
20a90 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e  g.** to determin
20aa0 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
20ab0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
20ac0 69 6c 65 20 65 78 69 73 74 73 2c 20 74 68 65 20  ile exists, the 
20ad0 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  IO error.** code
20ae0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
20af0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70   the value of *p
20b00 45 78 69 73 74 73 20 69 73 20 75 6e 64 65 66 69  Exists is undefi
20b10 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
20b20 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c  nt hasHotJournal
20b30 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
20b40 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20  int *pExists){. 
20b50 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
20b60 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
20b70 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
20b80 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
20b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
20ba0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
20bb0 74 20 65 78 69 73 74 73 3b 20 20 20 20 20 20 20  t exists;       
20bc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
20bd0 72 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c  rue if a journal
20be0 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74   file is present
20bf0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
20c00 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
20c10 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
20c20 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
20c30 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
20c40 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73  ger->fd) );.  as
20c50 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
20c60 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
20c70 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20c80 73 74 61 74 65 20 3c 3d 20 50 41 47 45 52 5f 53  state <= PAGER_S
20c90 48 41 52 45 44 20 29 3b 0a 0a 20 20 2a 70 45 78  HARED );..  *pEx
20ca0 69 73 74 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d  ists = 0;.  rc =
20cb0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
20cc0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
20cd0 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
20ce0 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
20cf0 65 78 69 73 74 73 29 3b 0a 20 20 69 66 28 20 72  exists);.  if( r
20d00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
20d10 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e  exists ){.    in
20d20 74 20 6c 6f 63 6b 65 64 3b 20 20 20 20 20 20 20  t locked;       
20d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
20d40 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73  e if some proces
20d50 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  s holds a RESERV
20d60 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20  ED lock */..    
20d70 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f  /* Race conditio
20d80 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72  n here:  Another
20d90 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68   process might h
20da0 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67  ave been holding
20db0 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   the.    ** the 
20dc0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e  RESERVED lock an
20dd0 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c  d have a journal
20de0 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c   open at the sql
20df0 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a  ite3OsAccess() .
20e00 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76      ** call abov
20e10 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65  e, but then dele
20e20 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  te the journal a
20e30 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b  nd drop the lock
20e40 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77   before.    ** w
20e50 65 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c  e get to the fol
20e60 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73  lowing sqlite3Os
20e70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
20e80 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68  k() call.  If th
20e90 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65  at.    ** is the
20ea0 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74   case, this rout
20eb0 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20  ine might think 
20ec0 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
20ed0 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20  ournal when.    
20ee0 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72 65  ** in fact there
20ef0 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20   is none.  This 
20f00 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c  results in a fal
20f10 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63  se-positive whic
20f20 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  h will.    ** be
20f30 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74   dealt with by t
20f40 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74  he playback rout
20f50 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38  ine.  Ticket #38
20f60 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  83..    */.    r
20f70 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65  c = sqlite3OsChe
20f80 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70  ckReservedLock(p
20f90 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b  Pager->fd, &lock
20fa0 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ed);.    if( rc=
20fb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c  =SQLITE_OK && !l
20fc0 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 69  ocked ){.      i
20fd0 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 20 20 20  nt nPage;..     
20fe0 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 73 69   /* Check the si
20ff0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
21000 73 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20 63  se file. If it c
21010 6f 6e 73 69 73 74 73 20 6f 66 20 30 20 70 61 67  onsists of 0 pag
21020 65 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  es,.      ** the
21030 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  n delete the jou
21040 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65 20 74  rnal file. See t
21050 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e  he header commen
21060 74 20 61 62 6f 76 65 20 66 6f 72 20 0a 20 20 20  t above for .   
21070 20 20 20 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e     ** the reason
21080 69 6e 67 20 68 65 72 65 2e 20 20 44 65 6c 65 74  ing here.  Delet
21090 65 20 74 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a  e the obsolete j
210a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65  ournal file unde
210b0 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 52 45 53  r.      ** a RES
210c0 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76  ERVED lock to av
210d0 6f 69 64 20 72 61 63 65 20 63 6f 6e 64 69 74 69  oid race conditi
210e0 6f 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f 69 64  ons and to avoid
210f0 20 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20   violating.     
21100 20 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20   ** [H33020]..  
21110 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
21120 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
21130 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
21140 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  &nPage);.      i
21150 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21160 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
21170 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
21180 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
21190 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
211a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
211b0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
211c0 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56  ager->fd, RESERV
211d0 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45  ED_LOCK)==SQLITE
211e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
211f0 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
21200 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  te(pVfs, pPager-
21210 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
21220 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
21230 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  e3OsUnlock(pPage
21240 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
21250 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  CK);.          }
21260 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
21270 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
21280 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  c();.        }el
21290 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
212a0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
212b0 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20  e exists and no 
212c0 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
212d0 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a   has a reserved.
212e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
212f0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
21300 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21310 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61  e. Now check tha
21320 74 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20  t there is.     
21330 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74       ** at least
21340 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79   one non-zero by
21350 74 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74  tes at the start
21360 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
21370 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20  file..          
21380 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20  ** If there is, 
21390 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72  then we consider
213a0 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f   this journal to
213b0 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c   be hot. If not,
213c0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69   .          ** i
213d0 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  t can be ignored
213e0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
213f0 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d           int f =
21400 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
21410 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
21420 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
21430 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
21440 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
21450 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
21460 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
21470 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20  , f, &f);.      
21480 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
21490 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
214a0 20 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20       u8 first = 
214b0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
214c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
214d0 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28  d(pPager->jfd, (
214e0 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31  void *)&first, 1
214f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
21500 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21510 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
21520 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  D ){.           
21530 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
21540 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  K;.            }
21550 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
21560 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
21570 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
21580 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d        *pExists =
21590 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20   (first!=0);.   
215a0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
215b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54   rc==SQLITE_CANT
215c0 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  OPEN ){.        
215d0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e      /* If we can
215e0 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c  not open the rol
215f0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69  lback journal fi
21600 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  le in order to s
21610 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20 20  ee if.          
21620 20 20 2a 2a 20 69 74 73 20 68 61 73 20 61 20 7a    ** its has a z
21630 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74  ero header, that
21640 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
21650 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f   an I/O error, o
21660 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
21670 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65   it might be due
21680 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e   to the race con
21690 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  dition described
216a0 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20   above and in.  
216b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63            ** tic
216c0 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68  ket #3883.  Eith
216d0 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74  er way, assume t
216e0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
216f0 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20  is hot..        
21700 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
21710 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73  t be a false pos
21720 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69  itive.  But if i
21730 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20  t is, then the. 
21740 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75             ** au
21750 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20  tomatic journal 
21760 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63  playback and rec
21770 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20  overy mechanism 
21780 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20  will deal.      
21790 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74        ** with it
217a0 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53   under an EXCLUS
217b0 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77  IVE lock where w
217c0 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  e do not need to
217d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
217e0 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69  worry so much wi
217f0 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  th race conditio
21800 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ns..            
21810 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  */.            *
21820 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20  pExists = 1;.   
21830 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
21840 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
21850 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
21860 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
21870 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
21880 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
21890 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67   content for pag
218a0 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65  e pPg out of the
218b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
218c0 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d  nd into .** pPg-
218d0 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72 65 64  >pData. A shared
218e0 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72   lock or greater
218f0 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e   must be held on
21900 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
21910 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69   file before thi
21920 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
21930 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  lled..**.** If p
21940 61 67 65 20 31 20 69 73 20 72 65 61 64 2c 20 74  age 1 is read, t
21950 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hen the value of
21960 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
21970 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a  s[] is set to.**
21980 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
21990 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
219a0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
219b0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
219c0 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  urs, then the IO
219d0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
219e0 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
219f0 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
21a00 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
21a10 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
21a20 20 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28   int readDbPage(
21a30 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
21a40 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
21a50 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50  Pg->pPager; /* P
21a60 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f  ager object asso
21a70 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65  ciated with page
21a80 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70   pPg */.  Pgno p
21a90 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
21aa0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
21ab0 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f  umber to read */
21ac0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
21ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ae0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
21af0 2f 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  /.  i64 iOffset;
21b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b10 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20   /* Byte offset 
21b20 6f 66 20 66 69 6c 65 20 74 6f 20 72 65 61 64 20  of file to read 
21b30 66 72 6f 6d 20 2a 2f 0a 0a 20 20 61 73 73 65 72  from */..  asser
21b40 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
21b50 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 26  >=PAGER_SHARED &
21b60 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73  & !MEMDB );.  as
21b70 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
21b80 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 69  ger->fd) );..  i
21b90 66 28 20 4e 45 56 45 52 28 21 69 73 4f 70 65 6e  f( NEVER(!isOpen
21ba0 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20 29 7b  (pPager->fd)) ){
21bb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
21bc0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
21bd0 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d  .    memset(pPg-
21be0 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >pData, 0, pPage
21bf0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
21c00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21c10 4f 4b 3b 0a 20 20 7d 0a 20 20 69 4f 66 66 73 65  OK;.  }.  iOffse
21c20 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
21c30 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
21c40 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ze;.  rc = sqlit
21c50 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
21c60 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c  >fd, pPg->pData,
21c70 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
21c80 65 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 69  e, iOffset);.  i
21c90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
21ca0 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
21cb0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
21cc0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
21cd0 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 75  pgno==1 ){.    u
21ce0 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d 20  8 *dbFileVers = 
21cf0 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74  &((u8*)pPg->pDat
21d00 61 29 5b 32 34 5d 3b 0a 20 20 20 20 6d 65 6d 63  a)[24];.    memc
21d10 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
21d20 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65  leVers, dbFileVe
21d30 72 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65  rs, sizeof(pPage
21d40 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
21d50 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50  .  }.  CODEC1(pP
21d60 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61  ager, pPg->pData
21d70 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20  , pgno, 3, rc = 
21d80 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a  SQLITE_NOMEM);..
21d90 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
21da0 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
21db0 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45  b_count);.  PAGE
21dc0 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
21dd0 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45  Read);.  IOTRACE
21de0 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22  (("PGIN %p %d\n"
21df0 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
21e00 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
21e10 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25  "FETCH %d page %
21e20 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
21e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21e40 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
21e50 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67   pgno, pager_pag
21e60 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20  ehash(pPg)));.. 
21e70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21e80 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
21e90 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
21ea0 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20  obtain a shared 
21eb0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
21ec0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74  base file..** It
21ed0 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63   is illegal to c
21ee0 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
21ef0 41 63 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20  Acquire() until 
21f00 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
21f10 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ion.** has been 
21f20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c  successfully cal
21f30 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64  led. If a shared
21f40 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79  -lock is already
21f50 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68   held when.** th
21f60 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
21f70 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
21f80 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
21f90 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74  following operat
21fa0 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65  ions are also pe
21fb0 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20  rformed by this 
21fc0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
21fd0 20 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65    1) If the page
21fe0 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69  r is currently i
21ff0 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73  n PAGER_UNLOCK s
22000 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65  tate (no lock he
22010 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68  ld.**      on th
22020 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  e database file)
22030 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70  , then an attemp
22040 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74  t is made to obt
22050 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48  ain a.**      SH
22060 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ARED lock on the
22070 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
22080 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  Immediately afte
22090 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20  r obtaining.**  
220a0 20 20 20 20 74 68 65 20 53 48 41 52 45 44 20 6c      the SHARED l
220b0 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79  ock, the file-sy
220c0 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20  stem is checked 
220d0 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
220e0 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68  l,.**      which
220f0 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20   is played back 
22100 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c  if present. Foll
22110 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f  owing any hot-jo
22120 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72  urnal .**      r
22130 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e  ollback, the con
22140 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63  tents of the cac
22150 68 65 20 61 72 65 20 76 61 6c 69 64 61 74 65 64  he are validated
22160 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20   by checking.** 
22170 20 20 20 20 20 74 68 65 20 27 63 68 61 6e 67 65       the 'change
22180 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20  -counter' field 
22190 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
221a0 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a  file header and.
221b0 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72 64 65  **      discarde
221c0 64 20 69 66 20 74 68 65 79 20 61 72 65 20 66 6f  d if they are fo
221d0 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69  und to be invali
221e0 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66  d..**.**   2) If
221f0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
22200 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
22210 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65  ve-mode, and the
22220 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  re are currently
22230 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73  .**      no outs
22240 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
22250 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c  es to any pages,
22260 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65   and is in the e
22270 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20  rror state,.**  
22280 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65      then an atte
22290 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  mpt is made to c
222a0 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73  lear the error s
222b0 74 61 74 65 20 62 79 20 64 69 73 63 61 72 64 69  tate by discardi
222c0 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63  ng.**      the c
222d0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
222e0 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f  age cache and ro
222f0 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f  lling back any o
22300 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  pen journal.**  
22310 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20      file..**.** 
22320 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  If the operation
22330 20 64 65 73 63 72 69 62 65 64 20 62 79 20 28 32   described by (2
22340 29 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 61  ) above is not a
22350 74 74 65 6d 70 74 65 64 2c 20 61 6e 64 20 69 66  ttempted, and if
22360 20 74 68 65 0a 2a 2a 20 70 61 67 65 72 20 69 73   the.** pager is
22370 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61   in an error sta
22380 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  te other than SQ
22390 4c 49 54 45 5f 46 55 4c 4c 20 77 68 65 6e 20 74  LITE_FULL when t
223a0 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a  his is called,.*
223b0 2a 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  * the error stat
223c0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
223d0 72 65 74 75 72 6e 65 64 2e 20 49 74 20 69 73 20  returned. It is 
223e0 70 65 72 6d 69 74 74 65 64 20 74 6f 20 72 65 61  permitted to rea
223f0 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  d the.** databas
22400 65 20 77 68 65 6e 20 69 6e 20 53 51 4c 49 54 45  e when in SQLITE
22410 5f 46 55 4c 4c 20 65 72 72 6f 72 20 73 74 61 74  _FULL error stat
22420 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  e..**.** Otherwi
22430 73 65 2c 20 69 66 20 65 76 65 72 79 74 68 69 6e  se, if everythin
22440 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
22450 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
22460 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 0a 2a 2a  turned. If an.**
22470 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
22480 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74   while locking t
22490 68 65 20 64 61 74 61 62 61 73 65 2c 20 63 68 65  he database, che
224a0 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d  cking for a hot-
224b0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
224c0 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  or rolling back 
224d0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  a journal file, 
224e0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
224f0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
22500 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
22510 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67  erSharedLock(Pag
22520 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
22530 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
22540 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
22550 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
22560 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 72 72 6f   */.  int isErro
22570 72 52 65 73 65 74 20 3d 20 30 3b 20 20 20 20 20  rReset = 0;     
22580 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
22590 20 69 66 20 72 65 63 6f 76 65 72 69 6e 67 20 66   if recovering f
225a0 72 6f 6d 20 65 72 72 6f 72 20 73 74 61 74 65 20  rom error state 
225b0 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  */..  /* This ro
225c0 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
225d0 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65  lled from b-tree
225e0 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74   and only when t
225f0 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a  here are no.  **
22600 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
22610 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
22620 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
22630 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
22640 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 69  Cache)==0 );.  i
22650 66 28 20 4e 45 56 45 52 28 4d 45 4d 44 42 20 26  f( NEVER(MEMDB &
22660 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
22670 65 29 20 29 7b 20 72 65 74 75 72 6e 20 70 50 61  e) ){ return pPa
22680 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 20 7d 0a  ger->errCode; }.
22690 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
226a0 74 61 62 61 73 65 20 69 73 20 69 6e 20 61 6e 20  tabase is in an 
226b0 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 6e 6f 77  error-state, now
226c0 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 6f 20   is a chance to 
226d0 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65 20 65  clear.  ** the e
226e0 72 72 6f 72 2e 20 44 69 73 63 61 72 64 20 74 68  rror. Discard th
226f0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
22700 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e  e pager-cache an
22710 64 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  d rollback.  ** 
22720 61 6e 79 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  any hot journal 
22730 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
22740 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  em..  */.  if( p
22750 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
22760 7b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  {.    if( isOpen
22770 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c  (pPager->jfd) ||
22780 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
22790 6c 20 29 7b 0a 20 20 20 20 20 20 69 73 45 72 72  l ){.      isErr
227a0 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a 20 20 20  orReset = 1;.   
227b0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65   }.    pPager->e
227c0 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  rrCode = SQLITE_
227d0 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65  OK;.    pager_re
227e0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  set(pPager);.  }
227f0 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
22800 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
22810 4f 43 4b 20 7c 7c 20 69 73 45 72 72 6f 72 52 65  OCK || isErrorRe
22820 73 65 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  set ){.    sqlit
22830 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
22840 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
22850 66 73 3b 0a 20 20 20 20 69 6e 74 20 69 73 48 6f  fs;.    int isHo
22860 74 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  tJournal = 0;.  
22870 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
22880 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
22890 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
228a0 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
228b0 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20  Cache)==0 );.   
228c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 52   if( pPager->noR
228d0 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  eadlock ){.     
228e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
228f0 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 20  >readOnly );.   
22900 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
22910 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
22920 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22930 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
22940 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
22950 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
22960 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
22970 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22980 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
22990 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
229a0 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  UNLOCK );.      
229b0 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
229c0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
229d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
229e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
229f0 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45  er->state>=SHARE
22a00 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 20 20 2f  D_LOCK );..    /
22a10 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  * If a journal f
22a20 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20  ile exists, and 
22a30 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45  there is no RESE
22a40 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
22a50 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
22a60 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65   file, then it e
22a70 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62  ither needs to b
22a80 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72  e played back or
22a90 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
22aa0 0a 20 20 20 20 69 66 28 20 21 69 73 45 72 72 6f  .    if( !isErro
22ab0 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20  rReset ){.      
22ac0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
22ad0 73 74 61 74 65 20 3c 3d 20 50 41 47 45 52 5f 53  state <= PAGER_S
22ae0 48 41 52 45 44 20 29 3b 0a 20 20 20 20 20 20 72  HARED );.      r
22af0 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  c = hasHotJourna
22b00 6c 28 70 50 61 67 65 72 2c 20 26 69 73 48 6f 74  l(pPager, &isHot
22b10 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
22b20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
22b30 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
22b40 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
22b50 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
22b60 69 73 45 72 72 6f 72 52 65 73 65 74 20 7c 7c 20  isErrorReset || 
22b70 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a  isHotJournal ){.
22b80 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20        /* Get an 
22b90 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
22ba0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
22bb0 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ile. At this poi
22bc0 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a  nt it is.      *
22bd0 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  * important that
22be0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
22bf0 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64   is not obtained
22c00 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74   on the way to t
22c10 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c  he.      ** EXCL
22c20 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69  USIVE lock. If i
22c30 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20  t were, another 
22c40 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70  process might op
22c50 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  en the.      ** 
22c60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64  database file, d
22c70 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56  etect the RESERV
22c80 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e  ED lock, and con
22c90 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20  clude that the. 
22ca0 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
22cb0 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64   is safe to read
22cc0 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63   while this proc
22cd0 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c  ess is still rol
22ce0 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20  ling the .      
22cf0 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62  ** hot-journal b
22d00 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20  ack..      ** . 
22d10 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20       ** Because 
22d20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
22d30 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
22d40 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c  s not requested,
22d50 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74   any.      ** ot
22d60 68 65 72 20 70 72 6f 63 65 73 73 20 61 74 74 65  her process atte
22d70 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73  mpting to access
22d80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
22d90 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a  le will get to .
22da0 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f        ** this po
22db0 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20  int in the code 
22dc0 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61  and fail to obta
22dd0 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55  in its own EXCLU
22de0 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20  SIVE lock .     
22df0 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62   ** on the datab
22e00 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  ase file..      
22e10 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  */.      if( pPa
22e20 67 65 72 2d 3e 73 74 61 74 65 3c 45 58 43 4c 55  ger->state<EXCLU
22e30 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
22e40 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
22e50 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
22e60 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  fd, EXCLUSIVE_LO
22e70 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CK);.        if(
22e80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22e90 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
22ea0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
22eb0 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
22ec0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
22ed0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22ee0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
22ef0 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
22f00 56 45 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20  VE;.      }. .  
22f10 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
22f20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
22f30 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54  /write access. T
22f40 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
22f50 6e 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c  n .      ** excl
22f60 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
22f70 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
22f80 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65  iptor will be ke
22f90 70 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20  pt open and.    
22fa0 20 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73    ** possibly us
22fb0 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  ed for a transac
22fc0 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f  tion later on. O
22fd0 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20  n some systems, 
22fe0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 73 54  the.      ** OsT
22ff0 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75  runcate() call u
23000 73 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65  sed in exclusive
23010 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 61 6c 73  -access mode als
23020 6f 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20  o requires.     
23030 20 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65   ** a read/write
23040 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20   file handle..  
23050 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
23060 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
23070 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
23080 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20   int res;.      
23090 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
230a0 41 63 63 65 73 73 28 70 56 66 73 2c 70 50 61 67  Access(pVfs,pPag
230b0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c  er->zJournal,SQL
230c0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
230d0 53 2c 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20  S,&res);.       
230e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
230f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
23100 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
23110 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20         int fout 
23120 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
23130 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f   int f = SQLITE_
23140 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
23150 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
23160 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
23170 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
23180 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
23190 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
231a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
231b0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
231c0 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
231d0 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b  >jfd, f, &fout);
231e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
231f0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
23200 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  OK || isOpen(pPa
23210 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20  ger->jfd) );.   
23220 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
23230 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f  =SQLITE_OK && fo
23240 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
23250 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  EADONLY ){.     
23260 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
23270 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
23280 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
23290 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
232a0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
232b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
232c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
232d0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a       /* If the j
232e0 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20  ournal does not 
232f0 65 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c  exist, it usuall
23300 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d  y means that som
23310 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  e .            *
23320 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
23330 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65  on managed to ge
23340 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74  t in and roll it
23350 20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20   back before .  
23360 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
23370 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74  s connection obt
23380 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73  ained the exclus
23390 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20  ive lock above. 
233a0 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20 20 20  Or, it .        
233b0 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20      ** may mean 
233c0 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77  that the pager w
233d0 61 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d  as in the error-
233e0 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a  state when this.
233f0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66              ** f
23400 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
23410 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  ed and the journ
23420 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
23430 20 65 78 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20   exist.  */.    
23440 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
23450 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
23460 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  on(pPager, 0);. 
23470 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23480 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
23490 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
234a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
234b0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
234c0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54     }..      /* T
234d0 4f 44 4f 3a 20 57 68 79 20 61 72 65 20 74 68 65  ODO: Why are the
234e0 73 65 20 63 6c 65 61 72 65 64 20 68 65 72 65 3f  se cleared here?
234f0 20 49 73 20 69 74 20 6e 65 63 65 73 73 61 72 79   Is it necessary
23500 3f 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65  ? */.      pPage
23510 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
23520 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  d = 0;.      pPa
23530 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
23540 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
23550 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
23560 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
23570 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
23580 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62   .      /* Playb
23590 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ack and delete t
235a0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f  he journal.  Dro
235b0 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  p the database w
235c0 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  rite.      ** lo
235d0 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65  ck and reacquire
235e0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20   the read lock. 
235f0 50 75 72 67 65 20 74 68 65 20 63 61 63 68 65 20  Purge the cache 
23600 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20  before.      ** 
23610 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65  playing back the
23620 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20   hot-journal so 
23630 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e  that we don't en
23640 64 20 75 70 20 77 69 74 68 0a 20 20 20 20 20 20  d up with.      
23650 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  ** an inconsiste
23660 6e 74 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20  nt cache..      
23670 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f  */.      if( isO
23680 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
23690 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
236a0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
236b0 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
236c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
236d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
236e0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
236f0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
23700 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
23710 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
23720 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
23730 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
23740 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
23750 41 52 45 44 29 0a 20 20 20 20 20 20 20 20 20 20  ARED).          
23760 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63   || (pPager->exc
23770 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50  lusiveMode && pP
23780 61 67 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45  ager->state>PAGE
23790 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  R_SHARED).      
237a0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
237b0 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  ( pPager->pBacku
237c0 70 20 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63  p || sqlite3Pcac
237d0 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
237e0 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29  er->pPCache)>0 )
237f0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73  {.      /* The s
23800 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a  hared-lock has j
23810 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65  ust been acquire
23820 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
23830 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
23840 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 6c  and there are al
23850 72 65 61 64 79 20 70 61 67 65 73 20 69 6e 20 74  ready pages in t
23860 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61  he cache (from a
23870 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
23880 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ** read or write
23890 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20   transaction).  
238a0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
238b0 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
238c0 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d     ** has been m
238d0 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65  odified.  If the
238e0 20 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68   database has ch
238f0 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65  anged, flush the
23900 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e  .      ** cache.
23910 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
23920 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e  ** Database chan
23930 67 65 73 20 69 73 20 64 65 74 65 63 74 65 64 20  ges is detected 
23940 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35  by looking at 15
23950 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67   bytes beginning
23960 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66  .      ** at off
23970 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20  set 24 into the 
23980 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74  file.  The first
23990 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62   4 of these 16 b
239a0 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a  ytes are.      *
239b0 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74  * a 32-bit count
239c0 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65  er that is incre
239d0 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68  mented with each
239e0 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20   change.  The.  
239f0 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74      ** other byt
23a00 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d  es change random
23a10 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c  ly with each fil
23a20 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20  e change when.  
23a30 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69      ** a codec i
23a40 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20  s in use..      
23a50 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  ** .      ** The
23a60 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e  re is a vanishin
23a70 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65  gly small chance
23a80 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77   that a change w
23a90 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20  ill not be .    
23aa0 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20    ** detected.  
23ab0 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e  The chance of an
23ac0 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e   undetected chan
23ad0 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74  ge is so small t
23ae0 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  hat.      ** it 
23af0 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64  can be neglected
23b00 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
23b10 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
23b20 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  [sizeof(pPager->
23b30 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20  dbFileVers)];.  
23b40 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
23b50 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
23b60 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  , 0);..      if(
23b70 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
23b80 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
23b90 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
23ba0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
23bb0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  ailed;.      }..
23bc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
23bd0 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
23be0 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  d );.      if( p
23bf0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20  Pager->dbSize>0 
23c00 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  ){.        IOTRA
23c10 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25  CE(("CKVERS %p %
23c20 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69  d\n", pPager, si
23c30 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
23c40 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
23c50 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
23c60 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69  Pager->fd, &dbFi
23c70 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
23c80 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b  bFileVers), 24);
23c90 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
23ca0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23cb0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
23cc0 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  led;.        }. 
23cd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
23ce0 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c      memset(dbFil
23cf0 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66  eVers, 0, sizeof
23d00 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  (dbFileVers));. 
23d10 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
23d20 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d  ( memcmp(pPager-
23d30 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46  >dbFileVers, dbF
23d40 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
23d50 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20  dbFileVers))!=0 
23d60 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
23d70 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
23d80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
23d90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
23da0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
23db0 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
23dc0 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  ==PAGER_SHARED )
23dd0 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a  ;.  }.. failed:.
23de0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
23df0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61  _OK ){.    /* pa
23e00 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20  ger_unlock() is 
23e10 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 65 78 63 6c  a no-op for excl
23e20 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 69  usive mode and i
23e30 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
23e40 65 73 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72  es. */.    pager
23e50 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
23e60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
23e70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
23e80 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
23e90 74 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65  t has reached ze
23ea0 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79  ro, rollback any
23eb0 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73   active.** trans
23ec0 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63  action and unloc
23ed0 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a  k the pager..**.
23ee0 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f  ** Except, in lo
23ef0 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55  cking_mode=EXCLU
23f00 53 49 56 45 20 77 68 65 6e 20 74 68 65 72 65 20  SIVE when there 
23f10 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e  is nothing to in
23f20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
23f30 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e   journal, the un
23f40 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66  lock is not perf
23f50 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20  ormed and there 
23f60 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f  is.** nothing to
23f70 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68   rollback, so th
23f80 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
23f90 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69  no-op..*/ .stati
23fa0 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
23fb0 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72  ckIfUnused(Pager
23fc0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
23fd0 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52   (sqlite3PcacheR
23fe0 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
23ff0 70 50 43 61 63 68 65 29 3d 3d 30 29 0a 20 20 20  pPCache)==0).   
24000 26 26 20 28 21 70 50 61 67 65 72 2d 3e 65 78 63  && (!pPager->exc
24010 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50  lusiveMode || pP
24020 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
24030 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 61  >0) .  ){.    pa
24040 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
24050 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
24060 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  }.}../*.** Acqui
24070 72 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  re a reference t
24080 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67  o page number pg
24090 6e 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61 67  no in pager pPag
240a0 65 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72 65  er (a page.** re
240b0 66 65 72 65 6e 63 65 20 68 61 73 20 74 79 70 65  ference has type
240c0 20 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74 68   DbPage*). If th
240d0 65 20 72 65 71 75 65 73 74 65 64 20 72 65 66 65  e requested refe
240e0 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63  rence is .** suc
240f0 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e  cessfully obtain
24100 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64  ed, it is copied
24110 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20   to *ppPage and 
24120 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
24130 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
24140 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
24150 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
24160 65 20 63 61 63 68 65 2c 20 69 74 20 69 73 20 72  e cache, it is r
24170 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68  eturned. .** Oth
24180 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61  erwise, a new pa
24190 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c  ge object is all
241a0 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c  ocated and popul
241b0 61 74 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a  ated with data.*
241c0 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  * read from the 
241d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
241e0 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68  n some cases, th
241f0 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20  e pcache module 
24200 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f  may.** choose no
24210 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20  t to allocate a 
24220 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20  new page object 
24230 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e  and may reuse an
24240 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a   existing.** obj
24250 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73  ect with no outs
24260 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
24270 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78  es..**.** The ex
24280 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65  tra data appende
24290 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61  d to a page is a
242a0 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65  lways initialize
242b0 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a  d to zeros the .
242c0 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61 20  ** first time a 
242d0 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69  page is loaded i
242e0 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74  nto memory. If t
242f0 68 65 20 70 61 67 65 20 72 65 71 75 65 73 74 65  he page requeste
24300 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79  d is .** already
24310 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 77 68   in the cache wh
24320 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
24330 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e   is called, then
24340 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61   the extra.** da
24350 74 61 20 69 73 20 6c 65 66 74 20 61 73 20 69 74  ta is left as it
24360 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 70 61   was when the pa
24370 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61  ge object was la
24380 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  st used..**.** I
24390 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
243a0 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20  mage is smaller 
243b0 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
243c0 65 64 20 70 61 67 65 20 6f 72 20 69 66 20 61 20  ed page or if a 
243d0 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  .** non-zero val
243e0 75 65 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ue is passed as 
243f0 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61  the noContent pa
24400 72 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65 20  rameter and the 
24410 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70 61  .** requested pa
24420 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
24430 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  y stored in the 
24440 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a  cache, then no .
24450 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72  ** actual disk r
24460 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74  ead occurs. In t
24470 68 69 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d  his case the mem
24480 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
24490 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69   .** page is ini
244a0 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20  tialized to all 
244b0 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  zeros. .**.** If
244c0 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72   noContent is tr
244d0 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ue, it means tha
244e0 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
244f0 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65   about the conte
24500 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  nts.** of the pa
24510 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20  ge. This occurs 
24520 69 6e 20 74 77 6f 20 73 65 70 65 72 61 74 65 20  in two seperate 
24530 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a  scenarios:.**.**
24540 20 20 20 61 29 20 57 68 65 6e 20 72 65 61 64 69     a) When readi
24550 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  ng a free-list l
24560 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68  eaf page from th
24570 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a  e database, and.
24580 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20  **.**   b) When 
24590 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62  a savepoint is b
245a0 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
245b0 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20   and we need to 
245c0 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e  load.**      a n
245d0 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ew page into the
245e0 20 63 61 63 68 65 20 74 6f 20 70 6f 70 75 6c 61   cache to popula
245f0 74 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  te with the data
24600 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72   read.**      fr
24610 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  om the savepoint
24620 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
24630 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20  If noContent is 
24640 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64  true, then the d
24650 61 74 61 20 72 65 74 75 72 6e 65 64 20 69 73 20  ata returned is 
24660 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f  zeroed instead o
24670 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20  f.** being read 
24680 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
24690 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  e. Additionally,
246a0 20 74 68 65 20 62 69 74 73 20 63 6f 72 72 65 73   the bits corres
246b0 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67  ponding.** to pg
246c0 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a  no in Pager.pInJ
246d0 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f  ournal (bitvec o
246e0 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  f pages already 
246f0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a  written to the.*
24700 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  * journal file) 
24710 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76  and the PagerSav
24720 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
24730 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20 61  int bitvecs of a
24740 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70  ny open.** savep
24750 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54  oints are set. T
24760 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65  his means if the
24770 20 70 61 67 65 20 69 73 20 6d 61 64 65 20 77 72   page is made wr
24780 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a  itable at any.**
24790 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
247a0 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61  ture, using a ca
247b0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
247c0 65 72 57 72 69 74 65 28 29 2c 20 69 74 73 20 63  erWrite(), its c
247d0 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20  ontents.** will 
247e0 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64  not be journaled
247f0 2e 20 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e  . This saves IO.
24800 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69  .**.** The acqui
24810 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69  sition might fai
24820 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65  l for several re
24830 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63  asons.  In all c
24840 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72  ases,.** an appr
24850 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
24860 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
24870 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  nd *ppPage is se
24880 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
24890 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
248a0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20  3PagerLookup(). 
248b0 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69   Both this routi
248c0 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20  ne and Lookup() 
248d0 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69  attempt.** to fi
248e0 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
248f0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
24900 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20   first.  If the 
24910 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
24920 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  ady.** in memory
24930 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67  , this routine g
24940 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72  oes to disk to r
24950 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61  ead it in wherea
24960 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75  s Lookup().** ju
24970 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54  st returns 0.  T
24980 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75  his routine acqu
24990 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
249a0 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
249b0 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20  it.** has to go 
249c0 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75  to disk, and cou
249d0 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b  ld also playback
249e0 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
249f0 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
24a00 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20   Since Lookup() 
24a10 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69  never goes to di
24a20 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73  sk, it never has
24a30 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f   to deal with lo
24a40 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61  cks.** or journa
24a50 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20  l files..*/.int 
24a60 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
24a70 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ire(.  Pager *pP
24a80 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
24a90 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
24aa0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
24ab0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
24ac0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
24ad0 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
24ae0 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
24af0 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
24b00 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
24b10 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
24b20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  */.  int noConte
24b30 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  nt       /* Do n
24b40 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e  ot bother readin
24b50 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  g content from d
24b60 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  isk if true */.)
24b70 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
24b80 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73  Hdr *pPg;..  ass
24b90 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
24ba0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
24bb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
24bc0 67 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52  ger->state>PAGER
24bd0 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66  _UNLOCK );..  if
24be0 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  ( pgno==0 ){.   
24bf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
24c00 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
24c10 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
24c20 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72  ger is in the er
24c30 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75 72  ror state, retur
24c40 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64  n an error immed
24c50 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74  iately. .  ** Ot
24c60 68 65 72 77 69 73 65 2c 20 72 65 71 75 65 73 74  herwise, request
24c70 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
24c80 68 65 20 50 43 61 63 68 65 20 6c 61 79 65 72 2e  he PCache layer.
24c90 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
24ca0 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
24cb0 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
24cc0 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
24cd0 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d  FULL ){.    rc =
24ce0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
24cf0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
24d00 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  c = sqlite3Pcach
24d10 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70  eFetch(pPager->p
24d20 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c  PCache, pgno, 1,
24d30 20 70 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20   ppPage);.  }.. 
24d40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
24d50 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74  OK ){.    /* Eit
24d60 68 65 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  her the call to 
24d70 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
24d80 63 68 28 29 20 72 65 74 75 72 6e 65 64 20 61 6e  ch() returned an
24d90 20 65 72 72 6f 72 20 6f 72 20 74 68 65 0a 20 20   error or the.  
24da0 20 20 2a 2a 20 70 61 67 65 72 20 77 61 73 20 61    ** pager was a
24db0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72  lready in the er
24dc0 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74  ror-state when t
24dd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  his function was
24de0 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20   called..    ** 
24df0 53 65 74 20 70 50 67 20 74 6f 20 30 20 61 6e 64  Set pPg to 0 and
24e00 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 78 63   jump to the exc
24e10 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20  eption handler. 
24e20 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 30 3b   */.    pPg = 0;
24e30 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f  .    goto pager_
24e40 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d  acquire_err;.  }
24e50 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50  .  assert( (*ppP
24e60 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f  age)->pgno==pgno
24e70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a   );.  assert( (*
24e80 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d  ppPage)->pPager=
24e90 3d 70 50 61 67 65 72 20 7c 7c 20 28 2a 70 70 50  =pPager || (*ppP
24ea0 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 30 20  age)->pPager==0 
24eb0 29 3b 0a 0a 20 20 69 66 28 20 28 2a 70 70 50 61  );..  if( (*ppPa
24ec0 67 65 29 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20  ge)->pPager ){. 
24ed0 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
24ee0 73 65 20 74 68 65 20 70 63 61 63 68 65 20 61 6c  se the pcache al
24ef0 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61  ready contains a
24f00 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f  n initialized co
24f10 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  py of.    ** the
24f20 20 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69   page. Return wi
24f30 74 68 6f 75 74 20 66 75 72 74 68 65 72 20 61 64  thout further ad
24f40 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  o.  */.    asser
24f50 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d  t( pgno<=PAGER_M
24f60 41 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21  AX_PGNO && pgno!
24f70 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
24f80 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 50 41  Pager) );.    PA
24f90 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
24fa0 3e 6e 48 69 74 29 3b 0a 20 20 20 20 72 65 74 75  >nHit);.    retu
24fb0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
24fc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
24fd0 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 68  he pager cache h
24fe0 61 73 20 63 72 65 61 74 65 64 20 61 20 6e 65 77  as created a new
24ff0 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65   page. Its conte
25000 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20  nt needs to .   
25010 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a   ** be initializ
25020 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ed.  */.    int 
25030 6e 4d 61 78 3b 0a 0a 20 20 20 20 50 41 47 45 52  nMax;..    PAGER
25040 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d  _INCR(pPager->nM
25050 69 73 73 29 3b 0a 20 20 20 20 70 50 67 20 3d 20  iss);.    pPg = 
25060 2a 70 70 50 61 67 65 3b 0a 20 20 20 20 70 50 67  *ppPage;.    pPg
25070 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
25080 72 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d  r;..    /* The m
25090 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62  aximum page numb
250a0 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75  er is 2^31. Retu
250b0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
250c0 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 20 20  T if a page.    
250d0 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65  ** number greate
250e0 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20  r than this, or 
250f0 74 68 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69  the unused locki
25100 6e 67 2d 70 61 67 65 2c 20 69 73 20 72 65 71 75  ng-page, is requ
25110 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  ested. */.    if
25120 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58  ( pgno>PAGER_MAX
25130 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50  _PGNO || pgno==P
25140 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
25150 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
25160 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
25170 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
25180 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
25190 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
251a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
251b0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
251c0 65 72 2c 20 26 6e 4d 61 78 29 3b 0a 20 20 20 20  er, &nMax);.    
251d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
251e0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
251f0 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
25200 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  r;.    }..    if
25210 28 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67 6e 6f  ( nMax<(int)pgno
25220 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 6e 6f 43   || MEMDB || noC
25230 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
25240 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
25250 3e 6d 78 50 67 6e 6f 20 29 7b 0a 09 72 63 20 3d  >mxPgno ){..rc =
25260 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 09 67   SQLITE_FULL;..g
25270 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
25280 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
25290 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65       if( noConte
252a0 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  nt ){.        /*
252b0 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20   Failure to set 
252c0 74 68 65 20 62 69 74 73 20 69 6e 20 74 68 65 20  the bits in the 
252d0 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65  InJournal bit-ve
252e0 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e  ctors is benign.
252f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d  .        ** It m
25300 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74  erely means that
25310 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d   we might do som
25320 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20  e extra work to 
25330 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20  journal a .     
25340 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20     ** page that 
25350 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
25360 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20   be journaled.  
25370 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65  Nevertheless, be
25380 20 73 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a   sure .        *
25390 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 63 61  * to test the ca
253a0 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f  se where a mallo
253b0 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  c error occurs w
253c0 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73  hile trying to s
253d0 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  et .        ** a
253e0 20 62 69 74 20 69 6e 20 61 20 62 69 74 20 76 65   bit in a bit ve
253f0 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ctor..        */
25400 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
25410 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
25420 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  c();.        if(
25430 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64   pgno<=pPager->d
25440 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20  bOrigSize ){.   
25450 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28         TESTONLY(
25460 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42   rc = ) sqlite3B
25470 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
25480 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e  >pInJournal, pgn
25490 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  o);.          te
254a0 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
254b0 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
254c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45      }.        TE
254d0 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61  STONLY( rc = ) a
254e0 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
254f0 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e  vecs(pPager, pgn
25500 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  o);.        test
25510 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
25520 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
25530 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
25540 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
25550 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25560 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61   memset(pPg->pDa
25570 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  ta, 0, pPager->p
25580 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
25590 7d 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  }.      IOTRACE(
255a0 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c  ("ZERO %p %d\n",
255b0 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
255c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
255d0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
255e0 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b  Pager==pPager );
255f0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
25600 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  DbPage(pPg);.   
25610 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
25620 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
25630 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
25640 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
25650 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
25660 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
25670 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
25680 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
25690 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
256a0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
256b0 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f  LITE_OK;..pager_
256c0 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61  acquire_err:.  a
256d0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
256e0 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  E_OK );.  if( pP
256f0 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
25700 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b  PcacheDrop(pPg);
25710 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f  .  }.  pagerUnlo
25720 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
25730 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d  r);..  *ppPage =
25740 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
25750 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
25760 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
25770 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
25780 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
25790 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
257a0 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
257b0 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
257c0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
257d0 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
257e0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
257f0 69 6e 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 20  in cache. Also, 
25800 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20  return 0 if the 
25810 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20  .** pager is in 
25820 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61  PAGER_UNLOCK sta
25830 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
25840 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
25850 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 70 61  .** or if the pa
25860 67 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72  ger is in an err
25870 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72 20 74  or state other t
25880 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e  han SQLITE_FULL.
25890 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
258a0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
258b0 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e  ).  The differen
258c0 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
258d0 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73  routine.** and s
258e0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
258f0 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
25900 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
25910 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
25920 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
25930 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
25940 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
25950 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
25960 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
25970 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
25980 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
25990 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
259a0 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
259b0 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61  appened..*/.DbPa
259c0 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ge *sqlite3Pager
259d0 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  Lookup(Pager *pP
259e0 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
259f0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
25a00 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   0;.  assert( pP
25a10 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
25a20 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
25a30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
25a40 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a  ->pPCache!=0 );.
25a50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
25a60 2d 3e 73 74 61 74 65 20 3e 20 50 41 47 45 52 5f  ->state > PAGER_
25a70 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 73 71 6c 69  UNLOCK );.  sqli
25a80 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
25a90 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
25aa0 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a  pgno, 0, &pPg);.
25ab0 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a    return pPg;.}.
25ac0 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
25ad0 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
25ae0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  .**.** If the nu
25af0 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
25b00 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  es to the page d
25b10 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  rop to zero, the
25b20 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73  n the.** page is
25b30 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
25b40 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c  U list.  When al
25b50 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  l references to 
25b60 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65  all pages.** are
25b70 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c   released, a rol
25b80 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64  lback occurs and
25b90 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
25ba0 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20   database is.** 
25bb0 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64  removed..*/.void
25bc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
25bd0 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
25be0 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
25bf0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
25c00 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
25c10 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
25c20 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
25c30 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
25c40 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20  nused(pPager);. 
25c50 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74   }.}../*.** If t
25c60 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
25c70 66 69 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79  file has already
25c80 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 65 6e   been opened, en
25c90 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 2a 2a  sure that the.**
25ca0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
25cb0 65 20 69 73 20 6f 70 65 6e 20 74 6f 6f 2e 20 49  e is open too. I
25cc0 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
25cd0 61 6c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 0a  al is not open,.
25ce0 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
25cf0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
25d00 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
25d10 72 65 74 75 72 6e 65 64 20 69 66 20 65 76 65 72  returned if ever
25d20 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f  ything goes acco
25d30 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 0a  rding to plan. .
25d40 2a 2a 20 41 6e 20 53 51 4c 49 54 45 5f 49 4f 45  ** An SQLITE_IOE
25d50 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64  RR_XXX error cod
25d60 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
25d70 20 61 20 63 61 6c 6c 20 74 6f 20 0a 2a 2a 20 73   a call to .** s
25d80 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 66  qlite3OsOpen() f
25d90 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
25da0 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e  int openSubJourn
25db0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
25dc0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
25dd0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69  LITE_OK;.  if( i
25de0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
25df0 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50  d) && !isOpen(pP
25e00 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20  ager->sjfd) ){. 
25e10 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
25e20 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
25e30 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
25e40 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e  MORY || pPager->
25e50 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a  subjInMemory ){.
25e60 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d        sqlite3Mem
25e70 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67  JournalOpen(pPag
25e80 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d  er->sjfd);.    }
25e90 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
25ea0 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70   pagerOpentemp(p
25eb0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
25ec0 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  jfd, SQLITE_OPEN
25ed0 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  _SUBJOURNAL);.  
25ee0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
25ef0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
25f00 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
25f10 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74 61  alled at the sta
25f20 72 74 20 6f 66 20 65 76 65 72 79 20 77 72 69 74  rt of every writ
25f30 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
25f40 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72  * There must alr
25f50 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56  eady be a RESERV
25f60 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
25f70 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
25f80 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68  base .** file wh
25f90 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
25fa0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
25fb0 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
25fc0 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
25fd0 20 70 50 61 67 65 72 20 61 6e 64 20 77 72 69 74   pPager and writ
25fe0 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  e a journal head
25ff0 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61  er.** to the sta
26000 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65  rt of it. If the
26010 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61  re are active sa
26020 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74  vepoints, open t
26030 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  he sub-journal.*
26040 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20  * as well. This 
26050 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
26060 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a   used when the j
26070 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62  ournal file is b
26080 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20  eing .** opened 
26090 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62  to write a rollb
260a0 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72  ack log for a tr
260b0 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
260c0 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68   not used .** wh
260d0 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74  en opening a hot
260e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
260f0 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a   roll it back..*
26100 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
26110 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65  nal file is alre
26120 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20  ady open (as it 
26130 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73  may be in exclus
26140 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68  ive mode),.** th
26150 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
26160 20 6a 75 73 74 20 77 72 69 74 65 73 20 61 20 6a   just writes a j
26170 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
26180 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
26190 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65  e.** already ope
261a0 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57  n file. .**.** W
261b0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
261c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
261d0 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73  s opened by this
261e0 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a   function, the.*
261f0 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  * Pager.pInJourn
26200 61 6c 20 62 69 74 76 65 63 20 73 74 72 75 63 74  al bitvec struct
26210 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
26220 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
26230 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
26240 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
26250 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c  sful. Otherwise,
26260 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
26270 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20  TE_NOMEM if the 
26280 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63  attempt to alloc
26290 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  ate Pager.pInJou
262a0 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a  rnal fails, or .
262b0 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  ** an IO error c
262c0 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f  ode if opening o
262d0 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f  r writing the jo
262e0 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73  urnal file fails
262f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26300 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
26310 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
26320 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
26330 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
26340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26350 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
26360 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  /.  sqlite3_vfs 
26370 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
26380 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f  Pager->pVfs;   /
26390 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
263a0 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a   vfs pointer */.
263b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
263c0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
263d0 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73  RESERVED );.  as
263e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
263f0 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
26400 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
26410 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
26420 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
26430 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
26440 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
26450 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==0 );.  .  /* I
26460 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  f already in the
26470 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68   error state, th
26480 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
26490 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a   no-op.  But on.
264a0 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68    ** the other h
264b0 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  and, this routin
264c0 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
264d0 64 20 69 66 20 77 65 20 61 72 65 20 61 6c 72 65  d if we are alre
264e0 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65  ady in.  ** an e
264f0 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20  rror state. */. 
26500 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
26510 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
26520 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
26530 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 54 4f 44 4f  Code;..  /* TODO
26540 3a 20 49 73 20 69 74 20 72 65 61 6c 6c 79 20 70  : Is it really p
26550 6f 73 73 69 62 6c 65 20 74 6f 20 67 65 74 20 68  ossible to get h
26560 65 72 65 20 77 69 74 68 20 64 62 53 69 7a 65 56  ere with dbSizeV
26570 61 6c 69 64 3d 3d 30 3f 20 49 66 20 6e 6f 74 2c  alid==0? If not,
26580 0a 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 74  .  ** the call t
26590 6f 20 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  o PagerPagecount
265a0 28 29 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65  () can be remove
265b0 64 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61  d..  */.  testca
265c0 73 65 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  se( pPager->dbSi
265d0 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20  zeValid==0 );.  
265e0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
265f0 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29  count(pPager, 0)
26600 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  ;..  pPager->pIn
26610 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
26620 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50  3BitvecCreate(pP
26630 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
26640 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e   if( pPager->pIn
26650 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20  Journal==0 ){.  
26660 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26670 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
26680 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
26690 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20  l file if it is 
266a0 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
266b0 2e 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70  . */.  if( !isOp
266c0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
266d0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
266e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
266f0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
26700 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
26710 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72    sqlite3MemJour
26720 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  nalOpen(pPager->
26730 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  jfd);.    }else{
26740 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
26750 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20   flags =        
26760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46             /* VF
26770 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20  S flags to open 
26780 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
26790 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
267a0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
267b0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
267c0 7c 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65  |.        (pPage
267d0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20  r->tempFile ? . 
267e0 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
267f0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
26800 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  OSE|SQLITE_OPEN_
26810 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20  TEMP_JOURNAL):. 
26820 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
26830 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
26840 41 4c 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 23  AL).        );.#
26850 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
26860 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
26870 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
26880 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a  te3JournalOpen(.
26890 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20            pVfs, 
268a0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
268b0 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
268c0 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72  lags, jrnlBuffer
268d0 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20  Size(pPager).   
268e0 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20     );.#else.    
268f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
26900 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
26910 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
26920 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
26930 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
26940 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
26950 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
26960 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
26970 64 29 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  d) );.  }...  /*
26980 20 57 72 69 74 65 20 74 68 65 20 66 69 72 73 74   Write the first
26990 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
269a0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
269b0 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20  ile and open .  
269c0 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ** the sub-journ
269d0 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
269e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
269f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26a00 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20   /* TODO: Check 
26a10 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20  if all of these 
26a20 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69  are really requi
26a30 72 65 64 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67  red. */.    pPag
26a40 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d  er->dbOrigSize =
26a50 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
26a60 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
26a70 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
26a80 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
26a90 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70  dSync = 0;.    p
26aa0 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
26ab0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
26ac0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
26ad0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
26ae0 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  er = 0;.    pPag
26af0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
26b00 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69   0;.    rc = wri
26b10 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
26b20 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
26b30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
26b40 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
26b50 69 6e 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  int ){.    rc = 
26b60 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70  openSubJournal(p
26b70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  Pager);.  }..  i
26b80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26b90 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
26ba0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
26bb0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
26bc0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  ;.    pPager->pI
26bd0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
26be0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
26bf0 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
26c00 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
26c10 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  n on the specifi
26c20 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e  ed pager object.
26c30 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d   If a .** write-
26c40 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
26c50 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65  already been ope
26c60 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ned, this functi
26c70 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
26c80 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c  *.** If the exFl
26c90 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66  ag argument is f
26ca0 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69  alse, then acqui
26cb0 72 65 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  re at least a RE
26cc0 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f  SERVED.** lock o
26cd0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26ce0 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69  ile. If exFlag i
26cf0 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71  s true, then acq
26d00 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a  uire at least.**
26d10 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
26d20 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ck. If such a lo
26d30 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
26d40 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a  ld, no locking .
26d50 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65  ** functions nee
26d60 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  d be called..**.
26d70 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  ** If this is no
26d80 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  t a temporary or
26d90 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20   in-memory file 
26da0 61 6e 64 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  and, the journal
26db0 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 6f 70 65   file is .** ope
26dc0 6e 65 64 20 69 66 20 69 74 20 68 61 73 20 6e 6f  ned if it has no
26dd0 74 20 62 65 65 6e 20 61 6c 72 65 61 64 79 2e 20  t been already. 
26de0 46 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20  For a temporary 
26df0 66 69 6c 65 2c 20 74 68 65 20 6f 70 65 6e 69 6e  file, the openin
26e00 67 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 75  g .** of the jou
26e10 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66  rnal file is def
26e20 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72  erred until ther
26e30 65 20 69 73 20 61 6e 20 61 63 74 75 61 6c 20 6e  e is an actual n
26e40 65 65 64 20 74 6f 20 0a 2a 2a 20 77 72 69 74 65  eed to .** write
26e50 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
26e60 20 54 4f 44 4f 3a 20 57 68 79 20 68 61 6e 64 6c   TODO: Why handl
26e70 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
26e80 73 20 64 69 66 66 65 72 65 6e 74 6c 79 3f 0a 2a  s differently?.*
26e90 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
26ea0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
26eb0 65 64 20 28 6f 72 20 69 66 20 69 74 20 69 73 20  ed (or if it is 
26ec0 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 20 74  already open), t
26ed0 68 65 6e 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  hen a.** journal
26ee0 2d 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74  -header is writt
26ef0 65 6e 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  en to the start 
26f00 6f 66 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  of it..**.** If 
26f10 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  the subjInMemory
26f20 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
26f30 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20  -zero, then any 
26f40 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e  sub-journal open
26f50 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69  ed.** within thi
26f60 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  s transaction wi
26f70 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20  ll be opened as 
26f80 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  an in-memory fil
26f90 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e  e. This.** has n
26fa0 6f 20 65 66 66 65 63 74 20 69 66 20 74 68 65 20  o effect if the 
26fb0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61  sub-journal is a
26fc0 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61  lready opened (a
26fd0 73 20 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e  s it may be when
26fe0 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65  .** running in e
26ff0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f  xclusive mode) o
27000 72 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63  r if the transac
27010 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65  tion does not re
27020 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a  quire a.** sub-j
27030 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73  ournal. If the s
27040 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75  ubjInMemory argu
27050 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68  ment is zero, th
27060 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a  en any required.
27070 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  ** sub-journal i
27080 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e  s implemented in
27090 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65  -memory if pPage
270a0 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  r is an in-memor
270b0 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20  y database, .** 
270c0 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f  or using a tempo
270d0 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77  rary file otherw
270e0 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ise..*/.int sqli
270f0 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 50 61  te3PagerBegin(Pa
27100 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
27110 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62   exFlag, int sub
27120 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e  jInMemory){.  in
27130 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
27140 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
27150 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
27160 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 70 50 61  _UNLOCK );.  pPa
27170 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72  ger->subjInMemor
27180 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65  y = (u8)subjInMe
27190 6d 6f 72 79 3b 0a 20 20 69 66 28 20 70 50 61 67  mory;.  if( pPag
271a0 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
271b0 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61  _SHARED ){.    a
271c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
271d0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
271e0 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
271f0 44 42 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  DB && !pPager->t
27200 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 20 20  empFile );..    
27210 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45  /* Obtain a RESE
27220 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
27230 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
27240 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 70 61  If the exFlag pa
27250 72 61 6d 65 74 65 72 0a 20 20 20 20 2a 2a 20 69  rameter.    ** i
27260 73 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d  s true, then imm
27270 65 64 69 61 74 65 6c 79 20 75 70 67 72 61 64 65  ediately upgrade
27280 20 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c   this to an EXCL
27290 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a  USIVE lock. The.
272a0 20 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64      ** busy-hand
272b0 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e  ler callback can
272c0 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 75 70   be used when up
272d0 67 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45  grading to the E
272e0 58 43 4c 55 53 49 56 45 0a 20 20 20 20 2a 2a 20  XCLUSIVE.    ** 
272f0 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68  lock, but not wh
27300 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65  en obtaining the
27310 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a   RESERVED lock..
27320 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
27330 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
27340 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56  ager->fd, RESERV
27350 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  ED_LOCK);.    if
27360 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27370 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
27380 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  >state = PAGER_R
27390 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 69  ESERVED;.      i
273a0 66 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20  f( exFlag ){.   
273b0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
273c0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
273d0 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
273e0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
273f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
27400 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b  he required lock
27410 73 20 77 65 72 65 20 73 75 63 63 65 73 73 66 75  s were successfu
27420 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 6f 70  lly obtained, op
27430 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  en the journal. 
27440 20 20 20 2a 2a 20 66 69 6c 65 20 61 6e 64 20 77     ** file and w
27450 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a  rite the first j
27460 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 74 6f  ournal-header to
27470 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
27480 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27490 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K && pPager->jou
274a0 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
274b0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
274c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
274d0 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
274e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
274f0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70    }else if( isOp
27500 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
27510 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
27520 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
27530 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  /* This happens 
27540 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 77  when the pager w
27550 61 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  as in exclusive-
27560 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20  access mode the 
27570 6c 61 73 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65  last.    ** time
27580 20 61 20 28 72 65 61 64 20 6f 72 20 77 72 69 74   a (read or writ
27590 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  e) transaction w
275a0 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
275b0 63 6f 6e 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a  concluded.    **
275c0 20 62 79 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   by this connect
275d0 69 6f 6e 2e 20 49 6e 73 74 65 61 64 20 6f 66 20  ion. Instead of 
275e0 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f 75  deleting the jou
275f0 72 6e 61 6c 20 66 69 6c 65 20 69 74 20 77 61 73  rnal file it was
27600 20 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70   .    ** kept op
27610 65 6e 20 61 6e 64 20 65 69 74 68 65 72 20 77 61  en and either wa
27620 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 30  s truncated to 0
27630 20 62 79 74 65 73 20 6f 72 20 69 74 73 20 68 65   bytes or its he
27640 61 64 65 72 20 77 61 73 0a 20 20 20 20 2a 2a 20  ader was.    ** 
27650 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
27660 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20   zeros..    */. 
27670 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
27680 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20  r->nRec==0 );.  
27690 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
276a0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20  ->dbOrigSize==0 
276b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
276c0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
276d0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  l==0 );.    rc =
276e0 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
276f0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  nal(pPager);.  }
27700 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
27710 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c  "TRANSACTION %d\
27720 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
27730 65 72 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28  er)));.  assert(
27740 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
27750 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  >jfd) || pPager-
27760 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c  >journalOff>0 ||
27770 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27780 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
27790 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
277a0 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 64 62  ert( !pPager->db
277b0 4d 6f 64 69 66 69 65 64 20 29 3b 0a 20 20 20 20  Modified );.    
277c0 2f 2a 20 49 67 6e 6f 72 65 20 61 6e 79 20 49 4f  /* Ignore any IO
277d0 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75   error that occu
277e0 72 73 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f  rs within pager_
277f0 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
27800 29 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 75  ). The.    ** pu
27810 72 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63 61  rpose of this ca
27820 6c 6c 20 69 73 20 74 6f 20 72 65 73 65 74 20 74  ll is to reset t
27830 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  he internal stat
27840 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 0a 20  e of the pager. 
27850 20 20 20 2a 2a 20 73 75 62 2d 73 79 73 74 65 6d     ** sub-system
27860 2e 20 49 74 20 64 6f 65 73 6e 27 74 20 6d 61 74  . It doesn't mat
27870 74 65 72 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ter if the journ
27880 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 70  al-file is not p
27890 72 6f 70 65 72 6c 79 0a 20 20 20 20 2a 2a 20 66  roperly.    ** f
278a0 69 6e 61 6c 69 7a 65 64 20 61 74 20 74 68 69 73  inalized at this
278b0 20 70 6f 69 6e 74 20 28 73 69 6e 63 65 20 69 74   point (since it
278c0 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20   is not a valid 
278d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 79  journal file any
278e0 77 61 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  way)..    */.   
278f0 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
27900 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30  action(pPager, 0
27910 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
27920 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  rc;.}../*.** Mar
27930 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20  k a single data 
27940 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
27950 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 77  e. The page is w
27960 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
27970 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  .** main journal
27980 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20   or sub-journal 
27990 61 73 20 72 65 71 75 69 72 65 64 2e 20 49 66 20  as required. If 
279a0 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
279b0 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20  ten into.** one 
279c0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c  of the journals,
279d0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
279e0 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  ng bit is set in
279f0 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70   the .** Pager.p
27a00 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63  InJournal bitvec
27a10 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61   and the PagerSa
27a20 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
27a30 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20  oint bitvecs.** 
27a40 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65  of any open save
27a50 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70  points as approp
27a60 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  riate..*/.static
27a70 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
27a80 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
27a90 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50  void *pData = pP
27aa0 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61 67 65  g->pData;.  Page
27ab0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
27ac0 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
27ad0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
27ae0 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
27af0 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20  e is not called 
27b00 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63  unless a transac
27b10 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
27b20 20 62 65 65 6e 0a 20 20 2a 2a 20 73 74 61 72 74   been.  ** start
27b30 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
27b40 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
27b50 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
27b60 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20   );..  /* If an 
27b70 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70  error has been p
27b80 72 65 76 69 6f 75 73 6c 79 20 64 65 74 65 63 74  reviously detect
27b90 65 64 2c 20 77 65 20 73 68 6f 75 6c 64 20 6e 6f  ed, we should no
27ba0 74 20 62 65 0a 20 20 2a 2a 20 63 61 6c 6c 69 6e  t be.  ** callin
27bb0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
27bc0 20 52 65 70 65 61 74 20 74 68 65 20 65 72 72 6f   Repeat the erro
27bd0 72 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  r for robustness
27be0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ..  */.  if( NEV
27bf0 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
27c00 64 65 29 20 29 20 20 72 65 74 75 72 6e 20 70 50  de) )  return pP
27c10 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a  ager->errCode;..
27c20 20 20 2f 2a 20 48 69 67 68 65 72 2d 6c 65 76 65    /* Higher-leve
27c30 6c 20 72 6f 75 74 69 6e 65 73 20 6e 65 76 65 72  l routines never
27c40 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
27c50 69 6f 6e 20 69 66 20 64 61 74 61 62 61 73 65 20  ion if database 
27c60 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 77 72 69 74  is not.  ** writ
27c70 61 62 6c 65 2e 20 20 42 75 74 20 63 68 65 63 6b  able.  But check
27c80 20 61 6e 79 77 61 79 2c 20 6a 75 73 74 20 66 6f   anyway, just fo
27c90 72 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f  r robustness. */
27ca0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
27cb0 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29  ger->readOnly) )
27cc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
27cd0 45 52 4d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ERM;..  assert( 
27ce0 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74  !pPager->setMast
27cf0 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50  er );..  CHECK_P
27d00 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  AGE(pPg);..  /* 
27d10 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
27d20 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20   dirty.  If the 
27d30 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79  page has already
27d40 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20   been written.  
27d50 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ** to the journa
27d60 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65  l then we can re
27d70 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e  turn right away.
27d80 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50  .  */.  sqlite3P
27d90 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70  cacheMakeDirty(p
27da0 50 67 29 3b 0a 20 20 69 66 28 20 70 61 67 65 49  Pg);.  if( pageI
27db0 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26  nJournal(pPg) &&
27dc0 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61   !subjRequiresPa
27dd0 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 70  ge(pPg) ){.    p
27de0 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
27df0 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d = 1;.  }else{.
27e00 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65  .    /* If we ge
27e10 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
27e20 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
27e30 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  ge needs to be. 
27e40 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f     ** written to
27e50 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
27e60 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20   journal or the 
27e70 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  ckeckpoint journ
27e80 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74  al.    ** or bot
27e90 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  h..    **.    **
27ea0 20 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72 6f   Higher level ro
27eb0 75 74 69 6e 65 73 20 73 68 6f 75 6c 64 20 68 61  utines should ha
27ec0 76 65 20 61 6c 72 65 61 64 79 20 73 74 61 72 74  ve already start
27ed0 65 64 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ed a transaction
27ee0 2c 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 6d  ,.    ** which m
27ef0 65 61 6e 73 20 74 68 65 79 20 68 61 76 65 20 61  eans they have a
27f00 63 71 75 69 72 65 64 20 74 68 65 20 6e 65 63 65  cquired the nece
27f10 73 73 61 72 79 20 6c 6f 63 6b 73 20 61 6e 64 20  ssary locks and 
27f20 6f 70 65 6e 65 64 0a 20 20 20 20 2a 2a 20 61 20  opened.    ** a 
27f30 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
27f40 2e 20 20 44 6f 75 62 6c 65 2d 63 68 65 63 6b 20  .  Double-check 
27f50 74 6f 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68  to makes sure th
27f60 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a  is is the case..
27f70 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
27f80 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
27f90 6e 28 70 50 61 67 65 72 2c 20 30 2c 20 70 50 61  n(pPager, 0, pPa
27fa0 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72  ger->subjInMemor
27fb0 79 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45  y);.    if( NEVE
27fc0 52 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  R(rc!=SQLITE_OK)
27fd0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
27fe0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
27ff0 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
28000 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65  r->jfd) && pPage
28010 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
28020 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
28030 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 61  E_OFF ){.      a
28040 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75  ssert( pPager->u
28050 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  seJournal );.   
28060 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
28070 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
28080 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
28090 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
280a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
280b0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64     pPager->dbMod
280c0 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 0a 20 20  ified = 1;.  .  
280d0 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
280e0 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77  tion journal now
280f0 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68   exists and we h
28100 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f  ave a RESERVED o
28110 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  r an.    ** EXCL
28120 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
28130 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
28140 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
28150 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
28160 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e  .    ** the tran
28170 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
28180 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
28190 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
281a0 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 61 67 65  */.    if( !page
281b0 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26  InJournal(pPg) &
281c0 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
281d0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69  >jfd) ){.      i
281e0 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  f( pPg->pgno<=pP
281f0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
28200 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20   ){.        u32 
28210 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63  cksum;.        c
28220 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20  har *pData2;..  
28230 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75        /* We shou
28240 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74  ld never write t
28250 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
28260 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74  le the page that
28270 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  .        ** cont
28280 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
28290 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f  e locks.  The fo
282a0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76  llowing assert v
282b0 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20  erifies.        
282c0 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
282d0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  t. */.        as
282e0 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21  sert( pPg->pgno!
282f0 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
28300 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
28310 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
28320 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
28330 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 7, return SQL
28340 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61  ITE_NOMEM, pData
28350 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75  2);.        cksu
28360 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  m = pager_cksum(
28370 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61  pPager, (u8*)pDa
28380 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ta2);.        rc
28390 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
283a0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
283b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
283c0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
283d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
283e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
283f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
28400 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
28410 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67  fd, pData2, pPag
28420 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  er->pageSize,.  
28430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28440 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
28450 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
28460 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   4);.          p
28470 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
28480 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  f += pPager->pag
28490 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20  eSize+4;.       
284a0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
284b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
284c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
284d0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
284e0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
284f0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75  journalOff, cksu
28500 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  m);.          pP
28510 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
28520 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d   += 4;.        }
28530 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
28540 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c  (("JOUT %p %d %l
28550 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
28560 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20  , pPg->pgno, .  
28570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
28580 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
28590 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
285a0 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50  ize));.        P
285b0 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
285c0 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
285d0 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50  ount);.        P
285e0 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52  AGERTRACE(("JOUR
285f0 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e  NAL %d page %d n
28600 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28  eedSync=%d hash(
28610 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
28620 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
28630 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
28640 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  o, .            
28650 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47   ((pPg->flags&PG
28660 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31  HDR_NEED_SYNC)?1
28670 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68  :0), pager_pageh
28680 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20  ash(pPg)));..   
28690 20 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20       /* Even if 
286a0 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c  an IO or diskful
286b0 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  l error occurred
286c0 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69   while journalli
286d0 6e 67 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ng the.        *
286e0 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c  * page in the bl
286f0 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74  ock above, set t
28700 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61  he need-sync fla
28710 67 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  g for the page..
28720 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72          ** Other
28730 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74  wise, when the t
28740 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
28750 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c  lled back, the l
28760 6f 67 69 63 20 69 6e 0a 20 20 20 20 20 20 20 20  ogic in.        
28770 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  ** playback_one_
28780 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e  page() will thin
28790 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  k that the page 
287a0 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74  needs to be rest
287b0 6f 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ored.        ** 
287c0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
287d0 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20  file. And if an 
287e0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
287f0 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a  while doing so,.
28800 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
28810 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66  corruption may f
28820 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a  ollow..        *
28830 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  /.        if( !p
28840 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
28850 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e  .          pPg->
28860 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
28870 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
28880 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
28890 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
288a0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
288b0 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  An error has occ
288c0 75 72 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f  urred writing to
288d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
288e0 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20  e. The .        
288f0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
28900 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ill be rolled ba
28910 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72 20  ck by the layer 
28920 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a  above..        *
28930 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  /.        if( rc
28940 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
28950 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
28960 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  rc;.        }.. 
28970 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
28980 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61  Rec++;.        a
28990 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
289a0 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
289b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
289c0 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
289d0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
289e0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
289f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28a00 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
28a10 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
28a20 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
28a30 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
28a40 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
28a50 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65   rc |= addToSave
28a60 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
28a70 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
28a80 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
28a90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28aa0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
28ab0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
28ac0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   );.          re
28ad0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
28ae0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
28af0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
28b00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
28b10 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ted && !pPager->
28b20 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
28b30 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
28b40 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
28b50 43 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  C;.          pPa
28b60 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
28b70 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
28b80 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
28b90 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65  ("APPEND %d page
28ba0 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c   %d needSync=%d\
28bb0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
28bc0 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
28bd0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a  er), pPg->pgno,.
28be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
28bf0 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
28c00 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
28c10 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )));.      }.   
28c20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
28c30 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
28c40 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e  urnal is open an
28c50 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
28c60 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20  t in it,.    ** 
28c70 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63  then write the c
28c80 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74  urrent page to t
28c90 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
28ca0 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74  rnal.  Note that
28cb0 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74  .    ** the stat
28cc0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f  ement journal fo
28cd0 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f  rmat differs fro
28ce0 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a  m the standard j
28cf0 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20  ournal format.  
28d00 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20    ** in that it 
28d10 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73  omits the checks
28d20 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64  ums and the head
28d30 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  er..    */.    i
28d40 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  f( subjRequiresP
28d50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20  age(pPg) ){.    
28d60 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61    rc = subjourna
28d70 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  lPage(pPg);.    
28d80 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  }.  }..  /* Upda
28d90 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
28da0 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e  size and return.
28db0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
28dc0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
28dd0 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
28de0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
28df0 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  ize<pPg->pgno ){
28e00 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
28e10 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
28e20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
28e30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
28e40 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  a data page as w
28e50 72 69 74 65 61 62 6c 65 2e 20 54 68 69 73 20 72  riteable. This r
28e60 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63  outine must be c
28e70 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a  alled before .**
28e80 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20   making changes 
28e90 74 6f 20 61 20 70 61 67 65 2e 20 54 68 65 20 63  to a page. The c
28ea0 61 6c 6c 65 72 20 6d 75 73 74 20 63 68 65 63 6b  aller must check
28eb0 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
28ec0 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66 75  e .** of this fu
28ed0 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65 20 63 61  nction and be ca
28ee0 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61  reful not to cha
28ef0 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74  nge any page dat
28f00 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69  a unless .** thi
28f10 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
28f20 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  s SQLITE_OK..**.
28f30 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
28f40 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66  e between this f
28f50 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65  unction and page
28f60 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61  r_write() is tha
28f70 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  t this.** functi
28f80 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69  on also deals wi
28f90 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  th the special c
28fa0 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d  ase where 2 or m
28fb0 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74  ore pages.** fit
28fc0 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73   on a single dis
28fd0 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69  k sector. In thi
28fe0 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65  s case all co-re
28ff0 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20  sident pages.** 
29000 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77  must have been w
29010 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
29020 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
29030 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
29040 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
29050 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  ccurs, SQLITE_NO
29060 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72  MEM or an IO err
29070 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
29080 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70  ned.** as approp
29090 72 69 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  riate. Otherwise
290a0 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  , SQLITE_OK..*/.
290b0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
290c0 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44  Write(DbPage *pD
290d0 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  bPage){.  int rc
290e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
290f0 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44   PgHdr *pPg = pD
29100 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a  bPage;.  Pager *
29110 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
29120 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61  ager;.  Pgno nPa
29130 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70  gePerSector = (p
29140 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
29150 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e/pPager->pageSi
29160 7a 65 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67  ze);..  if( nPag
29170 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a  ePerSector>1 ){.
29180 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f      Pgno nPageCo
29190 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  unt;          /*
291a0 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
291b0 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
291c0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50  se file */.    P
291d0 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20  gno pg1;        
291e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
291f0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
29200 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
29210 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  ted on. */.    i
29220 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
29230 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
29240 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72  er of pages star
29250 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a  ting at pg1 to j
29260 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e  ournal */.    in
29270 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
29280 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
29290 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  counter */.    i
292a0 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  nt needSync = 0;
292b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
292c0 20 69 66 20 61 6e 79 20 70 61 67 65 20 68 61 73   if any page has
292d0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
292e0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20   */..    /* Set 
292f0 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c  the doNotSync fl
29300 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73  ag to 1. This is
29310 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e   because we cann
29320 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e  ot allow a journ
29330 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72  al.    ** header
29340 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62   to be written b
29350 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65 73  etween the pages
29360 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68   journaled by th
29370 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  is function..   
29380 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
29390 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73  !MEMDB );.    as
293a0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
293b0 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  NotSync==0 );.  
293c0 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
293d0 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a  ync = 1;..    /*
293e0 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75   This trick assu
293f0 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68  mes that both th
29400 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
29410 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a  sector-size are.
29420 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65      ** an intege
29430 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74  r power of 2. It
29440 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70   sets variable p
29450 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69  g1 to the identi
29460 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74  fier.    ** of t
29470 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
29480 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20   the sector pPg 
29490 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20  is located on.. 
294a0 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20     */.    pg1 = 
294b0 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26  ((pPg->pgno-1) &
294c0 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f   ~(nPagePerSecto
294d0 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20  r-1)) + 1;..    
294e0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
294f0 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 28 69  count(pPager, (i
29500 6e 74 20 2a 29 26 6e 50 61 67 65 43 6f 75 6e 74  nt *)&nPageCount
29510 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  );.    if( pPg->
29520 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20  pgno>nPageCount 
29530 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
29540 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67   (pPg->pgno - pg
29550 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20  1)+1;.    }else 
29560 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65  if( (pg1+nPagePe
29570 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65  rSector-1)>nPage
29580 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e  Count ){.      n
29590 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e  Page = nPageCoun
295a0 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c  t+1-pg1;.    }el
295b0 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20  se{.      nPage 
295c0 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  = nPagePerSector
295d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
295e0 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20  rt(nPage>0);.   
295f0 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67   assert(pg1<=pPg
29600 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73  ->pgno);.    ass
29610 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e  ert((pg1+nPage)>
29620 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20  pPg->pgno);..   
29630 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50   for(ii=0; ii<nP
29640 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  age && rc==SQLIT
29650 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  E_OK; ii++){.   
29660 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31     Pgno pg = pg1
29670 2b 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72  +ii;.      PgHdr
29680 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69   *pPage;.      i
29690 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f  f( pg==pPg->pgno
296a0 20 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76   || !sqlite3Bitv
296b0 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
296c0 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29  InJournal, pg) )
296d0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67  {.        if( pg
296e0 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
296f0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
29700 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
29710 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
29720 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20  , pg, &pPage);. 
29730 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
29740 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29750 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
29760 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
29770 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
29780 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26  f( pPage->flags&
29790 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
297a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
297b0 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
297c0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
297d0 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64  ert(pPager->need
297e0 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20  Sync);.         
297f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
29800 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
29810 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
29820 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
29830 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
29840 20 28 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f   (pPage = pager_
29850 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
29860 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  g))!=0 ){.      
29870 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61    if( pPage->fla
29880 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
29890 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NC ){.          
298a0 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
298b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
298c0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
298d0 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
298e0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
298f0 49 66 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  If the PGHDR_NEE
29900 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20 73  D_SYNC flag is s
29910 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68  et for any of th
29920 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20  e nPage pages . 
29930 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
29940 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e  t pg1, then it n
29950 65 65 64 73 20 74 6f 20 62 65 20 73 65 74 20 66  eeds to be set f
29960 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20  or all of them. 
29970 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77  Because.    ** w
29980 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66  riting to any of
29990 20 74 68 65 73 65 20 6e 50 61 67 65 20 70 61 67   these nPage pag
299a0 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68  es may damage th
299b0 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20  e others, the.  
299c0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
299d0 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73  e must contain s
299e0 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f  ync()ed copies o
299f0 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20  f all of them.  
29a00 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20    ** before any 
29a10 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77  of them can be w
29a20 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68  ritten out to th
29a30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
29a40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
29a50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
29a60 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20   needSync ){.   
29a70 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
29a80 42 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53  B && pPager->noS
29a90 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ync==0 );.      
29aa0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61  for(ii=0; ii<nPa
29ab0 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ge; ii++){.     
29ac0 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 20     PgHdr *pPage 
29ad0 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
29ae0 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a  Pager, pg1+ii);.
29af0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
29b00 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  e ){.          p
29b10 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50  Page->flags |= P
29b20 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
29b30 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
29b40 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
29b50 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
29b60 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
29b70 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  rt(pPager->needS
29b80 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ync);.    }..   
29b90 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
29ba0 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b  >doNotSync==1 );
29bb0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
29bc0 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65  otSync = 0;.  }e
29bd0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  lse{.    rc = pa
29be0 67 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67  ger_write(pDbPag
29bf0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
29c00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
29c10 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
29c20 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74   page given in t
29c30 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  he argument was 
29c40 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65  previously passe
29c50 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50  d.** to sqlite3P
29c60 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e  agerWrite().  In
29c70 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
29c80 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20  turn TRUE if it 
29c90 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e  is ok.** to chan
29ca0 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ge the content o
29cb0 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  f the page..*/.#
29cc0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e  ifndef NDEBUG.in
29cd0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
29ce0 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65  writeable(DbPage
29cf0 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
29d00 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
29d10 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69  R_DIRTY;.}.#endi
29d20 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  f../*.** A call 
29d30 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
29d40 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
29d50 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e  that it is not n
29d60 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77  ecessary to.** w
29d70 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61  rite the informa
29d80 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67  tion on page pPg
29d90 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73   back to the dis
29da0 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a  k, even though.*
29db0 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68  * that page migh
29dc0 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  t be marked as d
29dd0 69 72 74 79 2e 20 20 54 68 69 73 20 68 61 70 70  irty.  This happ
29de0 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ens, for example
29df0 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61  , when.** the pa
29e00 67 65 20 68 61 73 20 62 65 65 6e 20 61 64 64 65  ge has been adde
29e10 64 20 61 73 20 61 20 6c 65 61 66 20 6f 66 20 74  d as a leaf of t
29e20 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20  he freelist and 
29e30 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e  so its.** conten
29e40 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74  t no longer matt
29e50 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  ers..**.** The o
29e60 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72  verlying softwar
29e70 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68  e layer calls th
29e80 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
29e90 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a  all of the data.
29ea0 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ** on the given 
29eb0 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20  page is unused. 
29ec0 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20  The pager marks 
29ed0 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
29ee0 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  n so.** that it 
29ef0 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69  does not get wri
29f00 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  tten to disk..**
29f10 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74  .** Tests show t
29f20 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  hat this optimiz
29f30 61 74 69 6f 6e 20 63 61 6e 20 71 75 61 64 72 75  ation can quadru
29f40 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66  ple the speed of
29f50 20 6c 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45 54   large .** DELET
29f60 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f  E operations..*/
29f70 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
29f80 65 72 44 6f 6e 74 57 72 69 74 65 28 50 67 48 64  erDontWrite(PgHd
29f90 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
29fa0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
29fb0 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 28 70  pPager;.  if( (p
29fc0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
29fd0 44 49 52 54 59 29 20 26 26 20 70 50 61 67 65 72  DIRTY) && pPager
29fe0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20  ->nSavepoint==0 
29ff0 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  ){.    PAGERTRAC
2a000 45 28 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70  E(("DONT_WRITE p
2a010 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  age %d of %d\n",
2a020 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45   pPg->pgno, PAGE
2a030 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
2a040 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45     IOTRACE(("CLE
2a050 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  AN %p %d\n", pPa
2a060 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
2a070 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
2a080 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  |= PGHDR_DONT_WR
2a090 49 54 45 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ITE;.#ifdef SQLI
2a0a0 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
2a0b0 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
2a0c0 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
2a0d0 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
2a0e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
2a0f0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2a100 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20  ed to increment 
2a110 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
2a120 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 0a   database file .
2a130 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  ** change-counte
2a140 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 34  r, stored as a 4
2a150 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e  -byte big-endian
2a160 20 69 6e 74 65 67 65 72 20 73 74 61 72 74 69 6e   integer startin
2a170 67 20 61 74 20 0a 2a 2a 20 62 79 74 65 20 6f 66  g at .** byte of
2a180 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 70  fset 24 of the p
2a190 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  ager file..**.**
2a1a0 20 49 66 20 74 68 65 20 69 73 44 69 72 65 63 74   If the isDirect
2a1b0 4d 6f 64 65 20 66 6c 61 67 20 69 73 20 7a 65 72  Mode flag is zer
2a1c0 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  o, then this is 
2a1d0 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  done by calling 
2a1e0 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
2a1f0 57 72 69 74 65 28 29 20 6f 6e 20 70 61 67 65 20  Write() on page 
2a200 31 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e  1, then modifyin
2a210 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
2a220 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 64 61  f the.** page da
2a230 74 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ta. In this case
2a240 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62   the file will b
2a250 65 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 74  e updated when t
2a260 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72  he current.** tr
2a270 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
2a280 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
2a290 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66  e isDirectMode f
2a2a0 6c 61 67 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  lag may only be 
2a2b0 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
2a2c0 6c 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70  library was comp
2a2d0 69 6c 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  iled.** with the
2a2e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
2a2f0 54 4f 4d 49 43 5f 57 52 49 54 45 20 6d 61 63 72  TOMIC_WRITE macr
2a300 6f 20 64 65 66 69 6e 65 64 2e 20 49 6e 20 74 68  o defined. In th
2a310 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 66 20 69  is case,.** if i
2a320 73 44 69 72 65 63 74 20 69 73 20 6e 6f 6e 2d 7a  sDirect is non-z
2a330 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 61  ero, then the da
2a340 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
2a350 70 64 61 74 65 64 20 64 69 72 65 63 74 6c 79 0a  pdated directly.
2a360 2a 2a 20 62 79 20 77 72 69 74 69 6e 67 20 61 6e  ** by writing an
2a370 20 75 70 64 61 74 65 64 20 76 65 72 73 69 6f 6e   updated version
2a380 20 6f 66 20 70 61 67 65 20 31 20 75 73 69 6e 67   of page 1 using
2a390 20 61 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 0a   a call to the .
2a3a0 2a 2a 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  ** sqlite3OsWrit
2a3b0 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  e() function..*/
2a3c0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
2a3d0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
2a3e0 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  nter(Pager *pPag
2a3f0 65 72 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74  er, int isDirect
2a400 4d 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Mode){.  int rc 
2a410 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
2a420 2f 2a 20 44 65 63 6c 61 72 65 20 61 6e 64 20 69  /* Declare and i
2a430 6e 69 74 69 61 6c 69 7a 65 20 63 6f 6e 73 74 61  nitialize consta
2a440 6e 74 20 69 6e 74 65 67 65 72 20 27 69 73 44 69  nt integer 'isDi
2a450 72 65 63 74 27 2e 20 49 66 20 74 68 65 0a 20 20  rect'. If the.  
2a460 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  ** atomic-write 
2a470 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
2a480 65 6e 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20  enabled in this 
2a490 62 75 69 6c 64 2c 20 74 68 65 6e 20 69 73 44 69  build, then isDi
2a4a0 72 65 63 74 0a 20 20 2a 2a 20 69 73 20 69 6e 69  rect.  ** is ini
2a4b0 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20  tialized to the 
2a4c0 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
2a4d0 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65  the isDirectMode
2a4e0 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 20   parameter.  ** 
2a4f0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
2a500 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
2a510 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  is always set to
2a520 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   zero..  **.  **
2a530 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61   The idea is tha
2a540 74 20 69 66 20 74 68 65 20 61 74 6f 6d 69 63 2d  t if the atomic-
2a550 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
2a560 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 65  on is not.  ** e
2a570 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
2a580 65 20 74 69 6d 65 2c 20 74 68 65 20 63 6f 6d 70  e time, the comp
2a590 69 6c 65 72 20 63 61 6e 20 6f 6d 69 74 20 74 68  iler can omit th
2a5a0 65 20 74 65 73 74 73 20 6f 66 0a 20 20 2a 2a 20  e tests of.  ** 
2a5b0 27 69 73 44 69 72 65 63 74 27 20 62 65 6c 6f 77  'isDirect' below
2a5c0 2c 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65  , as well as the
2a5d0 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65 64 20   block enclosed 
2a5e0 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 69 66 28  in the.  ** "if(
2a5f0 20 69 73 44 69 72 65 63 74 20 29 22 20 63 6f 6e   isDirect )" con
2a600 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66  dition..  */.#if
2a610 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  ndef SQLITE_ENAB
2a620 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
2a630 23 20 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f  # define DIRECT_
2a640 4d 4f 44 45 20 30 0a 20 20 61 73 73 65 72 74 28  MODE 0.  assert(
2a650 20 69 73 44 69 72 65 63 74 4d 6f 64 65 3d 3d 30   isDirectMode==0
2a660 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
2a670 41 4d 45 54 45 52 28 69 73 44 69 72 65 63 74 4d  AMETER(isDirectM
2a680 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 23 20 64 65  ode);.#else.# de
2a690 66 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44 45  fine DIRECT_MODE
2a6a0 20 69 73 44 69 72 65 63 74 4d 6f 64 65 0a 23 65   isDirectMode.#e
2a6b0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
2a6c0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
2a6d0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
2a6e0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
2a6f0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
2a700 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  && pPager->dbSiz
2a710 65 3e 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72  e>0 ){.    PgHdr
2a720 20 2a 70 50 67 48 64 72 3b 20 20 20 20 20 20 20   *pPgHdr;       
2a730 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66 65           /* Refe
2a740 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20  rence to page 1 
2a750 2a 2f 0a 20 20 20 20 75 33 32 20 63 68 61 6e 67  */.    u32 chang
2a760 65 5f 63 6f 75 6e 74 65 72 3b 20 20 20 20 20 20  e_counter;      
2a770 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
2a780 76 61 6c 75 65 20 6f 66 20 63 68 61 6e 67 65 2d  value of change-
2a790 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20 2a 2f  counter field */
2a7a0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ..    assert( !p
2a7b0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2a7c0 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
2a7d0 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  ->fd) );..    /*
2a7e0 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20   Open page 1 of 
2a7f0 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69  the file for wri
2a800 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20  ting. */.    rc 
2a810 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
2a820 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50  t(pPager, 1, &pP
2a830 67 48 64 72 29 3b 0a 20 20 20 20 61 73 73 65 72  gHdr);.    asser
2a840 74 28 20 70 50 67 48 64 72 3d 3d 30 20 7c 7c 20  t( pPgHdr==0 || 
2a850 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
2a860 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65  ..    /* If page
2a870 20 6f 6e 65 20 77 61 73 20 66 65 74 63 68 65 64   one was fetched
2a880 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 61   successfully, a
2a890 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
2a8a0 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 6f   is not.    ** o
2a8b0 70 65 72 61 74 69 6e 67 20 69 6e 20 64 69 72 65  perating in dire
2a8c0 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65 20 70 61  ct-mode, make pa
2a8d0 67 65 20 31 20 77 72 69 74 61 62 6c 65 2e 20 20  ge 1 writable.  
2a8e0 57 68 65 6e 20 6e 6f 74 20 69 6e 20 0a 20 20 20  When not in .   
2a8f0 20 2a 2a 20 64 69 72 65 63 74 20 6d 6f 64 65 2c   ** direct mode,
2a900 20 70 61 67 65 20 31 20 69 73 20 61 6c 77 61 79   page 1 is alway
2a910 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 20  s held in cache 
2a920 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 50 61  and hence the Pa
2a930 67 65 72 47 65 74 28 29 0a 20 20 20 20 2a 2a 20  gerGet().    ** 
2a940 61 62 6f 76 65 20 69 73 20 61 6c 77 61 79 73 20  above is always 
2a950 73 75 63 63 65 73 73 66 75 6c 20 2d 20 68 65 6e  successful - hen
2a960 63 65 20 74 68 65 20 41 4c 57 41 59 53 20 6f 6e  ce the ALWAYS on
2a970 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 2e 0a   rc==SQLITE_OK..
2a980 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
2a990 44 49 52 45 43 54 5f 4d 4f 44 45 20 26 26 20 41  DIRECT_MODE && A
2a9a0 4c 57 41 59 53 28 72 63 3d 3d 53 51 4c 49 54 45  LWAYS(rc==SQLITE
2a9b0 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 63  _OK) ){.      rc
2a9c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2a9d0 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20  rite(pPgHdr);.  
2a9e0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
2a9f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2aa00 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74      /* Increment
2aa10 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20   the value just 
2aa20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69  read and write i
2aa30 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32  t back to byte 2
2aa40 34 2e 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 6e  4. */.      chan
2aa50 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c  ge_counter = sql
2aa60 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75 38  ite3Get4byte((u8
2aa70 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  *)pPager->dbFile
2aa80 56 65 72 73 29 3b 0a 20 20 20 20 20 20 63 68 61  Vers);.      cha
2aa90 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  nge_counter++;. 
2aaa0 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 28       put32bits((
2aab0 28 63 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70  (char*)pPgHdr->p
2aac0 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65  Data)+24, change
2aad0 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20  _counter);..    
2aae0 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20    /* If running 
2aaf0 69 6e 20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20  in direct mode, 
2ab00 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  write the conten
2ab10 74 73 20 6f 66 20 70 61 67 65 20 31 20 74 6f 20  ts of page 1 to 
2ab20 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  the file. */.   
2ab30 20 20 20 69 66 28 20 44 49 52 45 43 54 5f 4d 4f     if( DIRECT_MO
2ab40 44 45 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  DE ){.        co
2ab50 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 20 3d  nst void *zBuf =
2ab60 20 70 50 67 48 64 72 2d 3e 70 44 61 74 61 3b 0a   pPgHdr->pData;.
2ab70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2ab80 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
2ab90 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ze>0 );.        
2aba0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
2abb0 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
2abc0 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61  zBuf, pPager->pa
2abd0 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20  geSize, 0);.    
2abe0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2abf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2ac00 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
2ac10 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a  eCountDone = 1;.
2ac20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ac30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
2ac40 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
2ac50 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20  ntDone = 1;.    
2ac60 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
2ac70 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61  * Release the pa
2ac80 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f  ge reference. */
2ac90 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
2aca0 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a  rUnref(pPgHdr);.
2acb0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2acc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
2acd0 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 74 6f  he pager file to
2ace0 20 64 69 73 6b 2e 20 54 68 69 73 20 69 73 20 61   disk. This is a
2acf0 20 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e 2d 6d 65   no-op for in-me
2ad00 6d 6f 72 79 20 66 69 6c 65 73 0a 2a 2a 20 6f 72  mory files.** or
2ad10 20 70 61 67 65 73 20 77 69 74 68 20 74 68 65 20   pages with the 
2ad20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61  Pager.noSync fla
2ad30 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  g set..**.** If 
2ad40 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 63  successful, or c
2ad50 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67 65 72  alled on a pager
2ad60 20 66 6f 72 20 77 68 69 63 68 20 69 74 20 69 73   for which it is
2ad70 20 61 20 6e 6f 2d 6f 70 2c 20 74 68 69 73 0a 2a   a no-op, this.*
2ad80 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
2ad90 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74  ns SQLITE_OK. Ot
2ada0 68 65 72 77 69 73 65 2c 20 61 6e 20 49 4f 20 65  herwise, an IO e
2adb0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
2adc0 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
2add0 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 50  lite3PagerSync(P
2ade0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2adf0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2ae00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae10 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2ae20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  code */.  assert
2ae30 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66  ( !MEMDB );.  if
2ae40 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
2ae50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
2ae60 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
2ae70 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2ae80 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
2ae90 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
2aea0 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 72  _flags);.  }.  r
2aeb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2aec0 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61  ** Sync the data
2aed0 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68  base file for th
2aee0 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20  e pager pPager. 
2aef0 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74  zMaster points t
2af00 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66  o the name.** of
2af10 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
2af20 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75  l file that shou
2af30 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
2af40 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  to the individua
2af50 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  l.** journal fil
2af60 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62  e. zMaster may b
2af70 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73  e NULL, which is
2af80 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
2af90 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  no master.** jou
2afa0 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64  rnal (a single d
2afb0 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
2afc0 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ion)..**.** This
2afd0 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73   routine ensures
2afe0 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   that:.**.**   *
2aff0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
2b000 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  le change-counte
2b010 72 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a  r is updated,.**
2b020 20 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c     * the journal
2b030 20 69 73 20 73 79 6e 63 65 64 20 28 75 6e 6c 65   is synced (unle
2b040 73 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ss the atomic-wr
2b050 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
2b060 20 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20 20 20   is used),.**   
2b070 2a 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  * all dirty page
2b080 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f  s are written to
2b090 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b0a0 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68 65 20  le, .**   * the 
2b0b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
2b0c0 20 74 72 75 6e 63 61 74 65 64 20 28 69 66 20 72   truncated (if r
2b0d0 65 71 75 69 72 65 64 29 2c 20 61 6e 64 0a 2a 2a  equired), and.**
2b0e0 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73     * the databas
2b0f0 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 0a  e file synced. .
2b100 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74  **.** The only t
2b110 68 69 6e 67 20 74 68 61 74 20 72 65 6d 61 69 6e  hing that remain
2b120 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20  s to commit the 
2b130 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74  transaction is t
2b140 6f 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a 20 28  o finalize .** (
2b150 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61 74 65  delete, truncate
2b160 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 66 69 72   or zero the fir
2b170 73 74 20 70 61 72 74 20 6f 66 29 20 74 68 65 20  st part of) the 
2b180 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72  journal file (or
2b190 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20   .** delete the 
2b1a0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
2b1b0 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64  ile if specified
2b1c0 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  )..**.** Note th
2b1d0 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e  at if zMaster==N
2b1e0 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e  ULL, this does n
2b1f0 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70  ot overwrite a p
2b200 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a  revious value.**
2b210 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71   passed to an sq
2b220 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
2b230 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e  PhaseOne() call.
2b240 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
2b250 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20 2d 20  nal parameter - 
2b260 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74 72 75 65  noSync - is true
2b270 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62  , then the datab
2b280 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 0a  ase file itself.
2b290 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64  ** is not synced
2b2a0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  . The caller mus
2b2b0 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  t call sqlite3Pa
2b2c0 67 65 72 53 79 6e 63 28 29 20 64 69 72 65 63 74  gerSync() direct
2b2d0 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74 68  ly to.** sync th
2b2e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2b2f0 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 43  before calling C
2b300 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
2b310 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a  to delete the.**
2b320 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
2b330 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69   this case..*/.i
2b340 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
2b350 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a 20  ommitPhaseOne(. 
2b360 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
2b370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b380 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
2b390 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2b3a0 20 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20 20 20   *zMaster,      
2b3b0 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20        /* If not 
2b3c0 4e 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74 65 72  NULL, the master
2b3d0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f   journal name */
2b3e0 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20 20 20  .  int noSync   
2b3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b400 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d     /* True to om
2b410 69 74 20 74 68 65 20 78 53 79 6e 63 20 6f 6e 20  it the xSync on 
2b420 74 68 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a 29  the db file */.)
2b430 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2b440 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2b450 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2b460 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  de */..  /* The 
2b470 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 6e 65  dbOrigSize is ne
2b480 76 65 72 20 73 65 74 20 69 66 20 6a 6f 75 72 6e  ver set if journ
2b490 61 6c 5f 6d 6f 64 65 3d 4f 46 46 20 2a 2f 0a 20  al_mode=OFF */. 
2b4a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2b4b0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
2b4c0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2b4d0 4f 46 46 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  OFF || pPager->d
2b4e0 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29 3b 0a  bOrigSize==0 );.
2b4f0 0a 20 20 2f 2a 20 49 66 20 61 20 70 72 69 6f 72  .  /* If a prior
2b500 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
2b510 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   this routine sh
2b520 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c  ould not be call
2b530 65 64 2e 20 20 52 4f 4c 4c 42 41 43 4b 0a 20 20  ed.  ROLLBACK.  
2b540 2a 2a 20 69 73 20 74 68 65 20 61 70 70 72 6f 70  ** is the approp
2b550 72 69 61 74 65 20 72 65 73 70 6f 6e 73 65 20 74  riate response t
2b560 6f 20 61 6e 20 65 72 72 6f 72 2c 20 6e 6f 74 20  o an error, not 
2b570 43 4f 4d 4d 49 54 2e 20 20 47 75 61 72 64 20 61  COMMIT.  Guard a
2b580 67 61 69 6e 73 74 0a 20 20 2a 2a 20 63 6f 64 69  gainst.  ** codi
2b590 6e 67 20 65 72 72 6f 72 73 20 62 79 20 72 65 70  ng errors by rep
2b5a0 65 61 74 69 6e 67 20 74 68 65 20 70 72 69 6f 72  eating the prior
2b5b0 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 69 66 28   error. */.  if(
2b5c0 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
2b5d0 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e  rrCode) ) return
2b5e0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2b5f0 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  ;..  PAGERTRACE(
2b600 28 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a  ("DATABASE SYNC:
2b610 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72   File=%s zMaster
2b620 3d 25 73 20 6e 53 69 7a 65 3d 25 64 5c 6e 22 2c  =%s nSize=%d\n",
2b630 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e   .      pPager->
2b640 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74  zFilename, zMast
2b650 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  er, pPager->dbSi
2b660 7a 65 29 29 3b 0a 0a 20 20 69 66 28 20 4d 45 4d  ze));..  if( MEM
2b670 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62  DB && pPager->db
2b680 4d 6f 64 69 66 69 65 64 20 29 7b 0a 20 20 20 20  Modified ){.    
2b690 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
2b6a0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f   in-memory db, o
2b6b0 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20  r no pages have 
2b6c0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c  been written to,
2b6d0 20 6f 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   or this.    ** 
2b6e0 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  function has alr
2b6f0 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
2b700 2c 20 69 74 20 69 73 20 6d 6f 73 74 6c 79 20 61  , it is mostly a
2b710 20 6e 6f 2d 6f 70 2e 20 20 48 6f 77 65 76 65 72   no-op.  However
2b720 2c 20 61 6e 79 0a 20 20 20 20 2a 2a 20 62 61 63  , any.    ** bac
2b730 6b 75 70 20 69 6e 20 70 72 6f 67 72 65 73 73 20  kup in progress 
2b740 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74  needs to be rest
2b750 61 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  arted..    */.  
2b760 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
2b770 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
2b780 42 61 63 6b 75 70 29 3b 0a 20 20 7d 65 6c 73 65  Backup);.  }else
2b790 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
2b7a0 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te!=PAGER_SYNCED
2b7b0 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f   && pPager->dbMo
2b7c0 64 69 66 69 65 64 20 29 7b 0a 0a 20 20 20 20 2f  dified ){..    /
2b7d0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2b7e0 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 20 74 68  block updates th
2b7f0 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
2b800 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 69 74  . Exactly how it
2b810 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 74 68 69  .    ** does thi
2b820 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65  s depends on whe
2b830 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
2b840 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70  atomic-update op
2b850 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a  timization.    *
2b860 2a 20 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74  * was enabled at
2b870 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 61   compile time, a
2b880 6e 64 20 69 66 20 74 68 69 73 20 74 72 61 6e 73  nd if this trans
2b890 61 63 74 69 6f 6e 20 6d 65 65 74 73 20 74 68 65  action meets the
2b8a0 20 0a 20 20 20 20 2a 2a 20 72 75 6e 74 69 6d 65   .    ** runtime
2b8b0 20 63 72 69 74 65 72 69 61 20 74 6f 20 75 73 65   criteria to use
2b8c0 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 3a 20   the operation: 
2b8d0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2b8e0 20 20 2a 20 54 68 65 20 66 69 6c 65 2d 73 79 73    * The file-sys
2b8f0 74 65 6d 20 73 75 70 70 6f 72 74 73 20 74 68 65  tem supports the
2b900 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72   atomic-write pr
2b910 6f 70 65 72 74 79 20 66 6f 72 0a 20 20 20 20 2a  operty for.    *
2b920 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66  *      blocks of
2b930 20 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c   size page-size,
2b940 20 61 6e 64 20 0a 20 20 20 20 2a 2a 20 20 20 20   and .    **    
2b950 2a 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69 73  * This commit is
2b960 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d   not part of a m
2b970 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61  ulti-file transa
2b980 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 2a  ction, and.    *
2b990 2a 20 20 20 20 2a 20 45 78 61 63 74 6c 79 20 6f  *    * Exactly o
2b9a0 6e 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  ne page has been
2b9b0 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73 74   modified and st
2b9c0 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ore in the journ
2b9d0 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  al file..    **.
2b9e0 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70      ** If the op
2b9f0 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61 73 20 6e  timization was n
2ba00 6f 74 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  ot enabled at co
2ba10 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 6e  mpile time, then
2ba20 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
2ba30 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
2ba40 6e 74 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 20  nter() function 
2ba50 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 75 70 64  is called to upd
2ba60 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 0a 20  ate the change. 
2ba70 20 20 20 2a 2a 20 63 6f 75 6e 74 65 72 20 69 6e     ** counter in
2ba80 20 27 69 6e 64 69 72 65 63 74 2d 6d 6f 64 65 27   'indirect-mode'
2ba90 2e 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  . If the optimiz
2baa0 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 69 6c 65  ation is compile
2bab0 64 20 69 6e 20 62 75 74 0a 20 20 20 20 2a 2a 20  d in but.    ** 
2bac0 69 73 20 6e 6f 74 20 61 70 70 6c 69 63 61 62 6c  is not applicabl
2bad0 65 20 74 6f 20 74 68 69 73 20 74 72 61 6e 73 61  e to this transa
2bae0 63 74 69 6f 6e 2c 20 63 61 6c 6c 20 73 71 6c 69  ction, call sqli
2baf0 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65  te3JournalCreate
2bb00 28 29 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b  ().    ** to mak
2bb10 65 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72 6e  e sure the journ
2bb20 61 6c 20 66 69 6c 65 20 68 61 73 20 61 63 74 75  al file has actu
2bb30 61 6c 6c 79 20 62 65 65 6e 20 63 72 65 61 74 65  ally been create
2bb40 64 2c 20 74 68 65 6e 20 63 61 6c 6c 0a 20 20 20  d, then call.   
2bb50 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63   ** pager_incr_c
2bb60 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74  hangecounter() t
2bb70 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
2bb80 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e 20 69  nge-counter in i
2bb90 6e 64 69 72 65 63 74 0a 20 20 20 20 2a 2a 20 6d  ndirect.    ** m
2bba0 6f 64 65 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ode. .    **.   
2bbb0 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69   ** Otherwise, i
2bbc0 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
2bbd0 6f 6e 20 69 73 20 62 6f 74 68 20 65 6e 61 62 6c  on is both enabl
2bbe0 65 64 20 61 6e 64 20 61 70 70 6c 69 63 61 62 6c  ed and applicabl
2bbf0 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 63  e,.    ** then c
2bc00 61 6c 6c 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  all pager_incr_c
2bc10 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74  hangecounter() t
2bc20 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
2bc30 6e 67 65 2d 63 6f 75 6e 74 65 72 0a 20 20 20 20  nge-counter.    
2bc40 2a 2a 20 69 6e 20 27 64 69 72 65 63 74 27 20 6d  ** in 'direct' m
2bc50 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ode. In this cas
2bc60 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
2bc70 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  le will never be
2bc80 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
2bc90 66 6f 72 20 74 68 69 73 20 74 72 61 6e 73 61 63  for this transac
2bca0 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  tion..    */.#if
2bcb0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2bcc0 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
2bcd0 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20     PgHdr *pPg;. 
2bce0 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
2bcf0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
2bd00 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
2bd10 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
2bd20 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a  RNALMODE_OFF );.
2bd30 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72      if( !zMaster
2bd40 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
2bd50 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 26 26  r->jfd) .     &&
2bd60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2bd70 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53  Off==jrnlBufferS
2bd80 69 7a 65 28 70 50 61 67 65 72 29 20 0a 20 20 20  ize(pPager) .   
2bd90 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53    && pPager->dbS
2bda0 69 7a 65 3e 3d 70 50 61 67 65 72 2d 3e 64 62 46  ize>=pPager->dbF
2bdb0 69 6c 65 53 69 7a 65 0a 20 20 20 20 20 26 26 20  ileSize.     && 
2bdc0 28 30 3d 3d 28 70 50 67 20 3d 20 73 71 6c 69 74  (0==(pPg = sqlit
2bdd0 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73  e3PcacheDirtyLis
2bde0 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
2bdf0 65 29 29 20 7c 7c 20 30 3d 3d 70 50 67 2d 3e 70  e)) || 0==pPg->p
2be00 44 69 72 74 79 29 0a 20 20 20 20 29 7b 0a 20 20  Dirty).    ){.  
2be10 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
2be20 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65  e db file change
2be30 20 63 6f 75 6e 74 65 72 20 76 69 61 20 74 68 65   counter via the
2be40 20 64 69 72 65 63 74 2d 77 72 69 74 65 20 6d 65   direct-write me
2be50 74 68 6f 64 2e 20 54 68 65 20 0a 20 20 20 20 20  thod. The .     
2be60 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61   ** following ca
2be70 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 20 74  ll will modify t
2be80 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
2be90 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70  resentation of p
2bea0 61 67 65 20 31 20 0a 20 20 20 20 20 20 2a 2a 20  age 1 .      ** 
2beb0 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 75  to include the u
2bec0 70 64 61 74 65 64 20 63 68 61 6e 67 65 20 63 6f  pdated change co
2bed0 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20 77  unter and then w
2bee0 72 69 74 65 20 70 61 67 65 20 31 20 0a 20 20 20  rite page 1 .   
2bef0 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74     ** directly t
2bf00 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2bf10 69 6c 65 2e 20 42 65 63 61 75 73 65 20 6f 66 20  ile. Because of 
2bf20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
2bf30 20 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 70 65   .      ** prope
2bf40 72 74 79 20 6f 66 20 74 68 65 20 68 6f 73 74 20  rty of the host 
2bf50 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 69  file-system, thi
2bf60 73 20 69 73 20 73 61 66 65 2e 0a 20 20 20 20 20  s is safe..     
2bf70 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70   */.      rc = p
2bf80 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
2bf90 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20  counter(pPager, 
2bfa0 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1);.    }else{. 
2bfb0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2bfc0 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 70  3JournalCreate(p
2bfd0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
2bfe0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2bff0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2c000 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f  rc = pager_incr_
2c010 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50  changecounter(pP
2c020 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
2c030 7d 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  }.    }.#else.  
2c040 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63    rc = pager_inc
2c050 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
2c060 70 50 61 67 65 72 2c 20 30 29 3b 0a 23 65 6e 64  pPager, 0);.#end
2c070 69 66 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  if.    if( rc!=S
2c080 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
2c090 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
2c0a0 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 49  _exit;..    /* I
2c0b0 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
2c0c0 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65 20  on has made the 
2c0d0 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72  database smaller
2c0e0 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  , then all pages
2c0f0 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69  .    ** being di
2c100 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74  scarded by the t
2c110 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62  runcation must b
2c120 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
2c130 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
2c140 66 69 6c 65 2e 20 54 68 69 73 20 63 61 6e 20 6f  file. This can o
2c150 6e 6c 79 20 68 61 70 70 65 6e 20 69 6e 20 61 75  nly happen in au
2c160 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 2e 0a  to-vacuum mode..
2c170 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 42 65      **.    ** Be
2c180 66 6f 72 65 20 72 65 61 64 69 6e 67 20 74 68 65  fore reading the
2c190 20 70 61 67 65 73 20 77 69 74 68 20 70 61 67 65   pages with page
2c1a0 20 6e 75 6d 62 65 72 73 20 6c 61 72 67 65 72 20   numbers larger 
2c1b0 74 68 61 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a  than the .    **
2c1c0 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
2c1d0 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  f Pager.dbSize, 
2c1e0 73 65 74 20 64 62 53 69 7a 65 20 62 61 63 6b 20  set dbSize back 
2c1f0 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20  to the value.   
2c200 20 2a 2a 20 74 68 61 74 20 69 74 20 74 6f 6f 6b   ** that it took
2c210 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
2c220 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2c230 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
2c240 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f  .    ** calls to
2c250 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
2c260 28 29 20 72 65 74 75 72 6e 20 7a 65 72 6f 65 64  () return zeroed
2c270 20 70 61 67 65 73 20 69 6e 73 74 65 61 64 20 6f   pages instead o
2c280 66 20 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  f .    ** readin
2c290 67 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  g data from the 
2c2a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
2c2b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 68 65     **.    ** Whe
2c2c0 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 3d  n journal_mode==
2c2d0 4f 46 46 20 74 68 65 20 64 62 4f 72 69 67 53 69  OFF the dbOrigSi
2c2e0 7a 65 20 69 73 20 61 6c 77 61 79 73 20 7a 65 72  ze is always zer
2c2f0 6f 2c 20 73 6f 20 74 68 69 73 0a 20 20 20 20 2a  o, so this.    *
2c300 2a 20 62 6c 6f 63 6b 20 6e 65 76 65 72 20 72 75  * block never ru
2c310 6e 73 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  ns if journal_mo
2c320 64 65 3d 4f 46 46 2e 0a 20 20 20 20 2a 2f 0a 23  de=OFF..    */.#
2c330 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2c340 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2c350 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
2c360 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 4f  Size<pPager->dbO
2c370 72 69 67 53 69 7a 65 20 0a 20 20 20 20 20 26 26  rigSize .     &&
2c380 20 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e   ALWAYS(pPager->
2c390 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
2c3a0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2c3b0 46 46 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  FF).    ){.     
2c3c0 20 50 67 6e 6f 20 69 3b 20 20 20 20 20 20 20 20   Pgno i;        
2c3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c3e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
2c3f0 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
2c400 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 50  */.      const P
2c410 67 6e 6f 20 69 53 6b 69 70 20 3d 20 50 41 47 45  gno iSkip = PAGE
2c420 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
2c430 29 3b 20 2f 2a 20 50 65 6e 64 69 6e 67 20 6c 6f  ); /* Pending lo
2c440 63 6b 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ck page */.     
2c450 20 63 6f 6e 73 74 20 50 67 6e 6f 20 64 62 53 69   const Pgno dbSi
2c460 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
2c470 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 44 61  ize;       /* Da
2c480 74 61 62 61 73 65 20 69 6d 61 67 65 20 73 69 7a  tabase image siz
2c490 65 20 2a 2f 20 0a 20 20 20 20 20 20 70 50 61 67  e */ .      pPag
2c4a0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
2c4b0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
2c4c0 0a 20 20 20 20 20 20 66 6f 72 28 20 69 3d 64 62  .      for( i=db
2c4d0 53 69 7a 65 2b 31 3b 20 69 3c 3d 70 50 61 67 65  Size+1; i<=pPage
2c4e0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 20 69  r->dbOrigSize; i
2c4f0 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ++ ){.        if
2c500 28 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63  ( !sqlite3Bitvec
2c510 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
2c520 4a 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26 20 69  Journal, i) && i
2c530 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20  !=iSkip ){.     
2c540 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
2c550 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
2c560 2a 20 50 61 67 65 20 74 6f 20 6a 6f 75 72 6e 61  * Page to journa
2c570 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  l */.          r
2c580 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2c590 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26  Get(pPager, i, &
2c5a0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
2c5b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2c5c0 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
2c5d0 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
2c5e0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
2c5f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2c600 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  te(pPage);.     
2c610 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
2c620 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
2c630 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2c640 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2c650 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
2c660 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  ne_exit;.       
2c670 20 7d 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20   }.      } .    
2c680 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
2c690 20 3d 20 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d   = dbSize;.    }
2c6a0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
2c6b0 57 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  Write the master
2c6c0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
2c6d0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
2c6e0 69 6c 65 2e 20 49 66 20 61 20 6d 61 73 74 65 72  ile. If a master
2c6f0 20 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c   .    ** journal
2c700 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61   file name has a
2c710 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
2c720 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
2c730 61 6c 20 66 69 6c 65 2c 20 0a 20 20 20 20 2a 2a  al file, .    **
2c740 20 6f 72 20 69 66 20 7a 4d 61 73 74 65 72 20 69   or if zMaster i
2c750 73 20 4e 55 4c 4c 20 28 6e 6f 20 6d 61 73 74 65  s NULL (no maste
2c760 72 20 6a 6f 75 72 6e 61 6c 29 2c 20 74 68 65 6e  r journal), then
2c770 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
2c780 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  no-op..    */.  
2c790 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74    rc = writeMast
2c7a0 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
2c7b0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
2c7c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2c7d0 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f  K ) goto commit_
2c7e0 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a  phase_one_exit;.
2c7f0 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
2c800 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
2c810 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64  f the atomic-upd
2c820 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ate optimization
2c830 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a   is being.    **
2c840 20 75 73 65 64 2c 20 74 68 69 73 20 63 61 6c 6c   used, this call
2c850 20 77 69 6c 6c 20 6e 6f 74 20 63 72 65 61 74 65   will not create
2c860 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2c870 65 20 6f 72 20 70 65 72 66 6f 72 6d 20 61 6e 79  e or perform any
2c880 0a 20 20 20 20 2a 2a 20 72 65 61 6c 20 49 4f 2e  .    ** real IO.
2c890 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
2c8a0 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
2c8b0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
2c8c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2c8d0 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
2c8e0 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f  one_exit;..    /
2c8f0 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74  * Write all dirt
2c900 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64  y pages to the d
2c910 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
2c920 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
2c930 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 73  write_pagelist(s
2c940 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
2c950 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
2c960 43 61 63 68 65 29 29 3b 0a 20 20 20 20 69 66 28  Cache));.    if(
2c970 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2c980 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2c990 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
2c9a0 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20  _BLOCKED );.    
2c9b0 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68    goto commit_ph
2c9c0 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20  ase_one_exit;.  
2c9d0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
2c9e0 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50  cacheCleanAll(pP
2c9f0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
2ca00 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
2ca10 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6e  ile on disk is n
2ca20 6f 74 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65  ot the same size
2ca30 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73 65   as the database
2ca40 20 69 6d 61 67 65 2c 0a 20 20 20 20 2a 2a 20 74   image,.    ** t
2ca50 68 65 6e 20 75 73 65 20 70 61 67 65 72 5f 74 72  hen use pager_tr
2ca60 75 6e 63 61 74 65 20 74 6f 20 67 72 6f 77 20 6f  uncate to grow o
2ca70 72 20 73 68 72 69 6e 6b 20 74 68 65 20 66 69 6c  r shrink the fil
2ca80 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  e here..    */. 
2ca90 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
2caa0 62 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 64  bSize!=pPager->d
2cab0 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  bFileSize ){.   
2cac0 20 20 20 50 67 6e 6f 20 6e 4e 65 77 20 3d 20 70     Pgno nNew = p
2cad0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 2d 20  Pager->dbSize - 
2cae0 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d  (pPager->dbSize=
2caf0 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
2cb00 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 61  Pager));.      a
2cb10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2cb20 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
2cb30 55 53 49 56 45 20 29 3b 0a 20 20 20 20 20 20 72  USIVE );.      r
2cb40 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
2cb50 74 65 28 70 50 61 67 65 72 2c 20 6e 4e 65 77 29  te(pPager, nNew)
2cb60 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2cb70 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2cb80 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
2cb90 65 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 20  e_exit;.    }.. 
2cba0 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 73     /* Finally, s
2cbb0 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
2cbc0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
2cbd0 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
2cbe0 63 20 26 26 20 21 6e 6f 53 79 6e 63 20 29 7b 0a  c && !noSync ){.
2cbf0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2cc00 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
2cc10 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  >fd, pPager->syn
2cc20 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a  c_flags);.    }.
2cc30 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
2cc40 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
2cc50 65 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65 72  er))..    pPager
2cc60 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
2cc70 53 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a 63 6f 6d  SYNCED;.  }..com
2cc80 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
2cc90 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  it:.  return rc;
2cca0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  .}.../*.** When 
2ccb0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2ccc0 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 64 61 74   called, the dat
2ccd0 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62  abase file has b
2cce0 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 2a  een completely.*
2ccf0 2a 20 75 70 64 61 74 65 64 20 74 6f 20 72 65 66  * updated to ref
2cd00 6c 65 63 74 20 74 68 65 20 63 68 61 6e 67 65 73  lect the changes
2cd10 20 6d 61 64 65 20 62 79 20 74 68 65 20 63 75 72   made by the cur
2cd20 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
2cd30 20 61 6e 64 0a 2a 2a 20 73 79 6e 63 65 64 20 74   and.** synced t
2cd40 6f 20 64 69 73 6b 2e 20 54 68 65 20 6a 6f 75 72  o disk. The jour
2cd50 6e 61 6c 20 66 69 6c 65 20 73 74 69 6c 6c 20 65  nal file still e
2cd60 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c  xists in the fil
2cd70 65 2d 73 79 73 74 65 6d 20 0a 2a 2a 20 74 68 6f  e-system .** tho
2cd80 75 67 68 2c 20 61 6e 64 20 69 66 20 61 20 66 61  ugh, and if a fa
2cd90 69 6c 75 72 65 20 6f 63 63 75 72 73 20 61 74 20  ilure occurs at 
2cda0 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 69  this point it wi
2cdb0 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a  ll eventually.**
2cdc0 20 62 65 20 75 73 65 64 20 61 73 20 61 20 68 6f   be used as a ho
2cdd0 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  t-journal and th
2cde0 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
2cdf0 63 74 69 6f 6e 20 72 6f 6c 6c 65 64 20 62 61 63  ction rolled bac
2ce00 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  k..**.** This fu
2ce10 6e 63 74 69 6f 6e 20 66 69 6e 61 6c 69 7a 65 73  nction finalizes
2ce20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2ce30 65 2c 20 65 69 74 68 65 72 20 62 79 20 64 65 6c  e, either by del
2ce40 65 74 69 6e 67 2c 20 0a 2a 2a 20 74 72 75 6e 63  eting, .** trunc
2ce50 61 74 69 6e 67 20 6f 72 20 70 61 72 74 69 61 6c  ating or partial
2ce60 6c 79 20 7a 65 72 6f 69 6e 67 20 69 74 2c 20 73  ly zeroing it, s
2ce70 6f 20 74 68 61 74 20 69 74 20 63 61 6e 6e 6f 74  o that it cannot
2ce80 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72   be used .** for
2ce90 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
2cea0 6c 62 61 63 6b 2e 20 4f 6e 63 65 20 74 68 69 73  lback. Once this
2ceb0 20 69 73 20 64 6f 6e 65 20 74 68 65 20 74 72 61   is done the tra
2cec0 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 69  nsaction is.** i
2ced0 72 72 65 76 6f 63 61 62 6c 79 20 63 6f 6d 6d 69  rrevocably commi
2cee0 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tted..**.** If a
2cef0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2cf00 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
2cf10 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
2cf20 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 6d 6f   the pager.** mo
2cf30 76 65 73 20 69 6e 74 6f 20 74 68 65 20 65 72 72  ves into the err
2cf40 6f 72 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77  or state. Otherw
2cf50 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ise, SQLITE_OK i
2cf60 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
2cf70 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
2cf80 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 50 61  ommitPhaseTwo(Pa
2cf90 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2cfa0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2cfb0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
2cfc0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2cfd0 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69  ode */..  /* Thi
2cfe0 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
2cff0 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 69   not be called i
2d000 66 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20  f a prior error 
2d010 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 20 20  has occurred..  
2d020 2a 2a 20 42 75 74 20 69 66 20 28 64 75 65 20 74  ** But if (due t
2d030 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72  o a coding error
2d040 20 65 6c 73 65 77 68 65 72 65 20 69 6e 20 74 68   elsewhere in th
2d050 65 20 73 79 73 74 65 6d 29 20 69 74 20 64 6f 65  e system) it doe
2d060 73 20 67 65 74 0a 20 20 2a 2a 20 63 61 6c 6c 65  s get.  ** calle
2d070 64 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74  d, just return t
2d080 68 65 20 73 61 6d 65 20 65 72 72 6f 72 20 63 6f  he same error co
2d090 64 65 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  de without doing
2d0a0 20 61 6e 79 74 68 69 6e 67 2e 20 2a 2f 0a 20 20   anything. */.  
2d0b0 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
2d0c0 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74  ->errCode) ) ret
2d0d0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
2d0e0 6f 64 65 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  ode;..  /* This 
2d0f0 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
2d100 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 69 66  not be called if
2d110 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
2d120 74 20 69 6e 20 61 74 20 6c 65 61 73 74 0a 20 20  t in at least.  
2d130 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
2d140 44 20 73 74 61 74 65 2e 20 41 6e 64 20 69 6e 64  D state. And ind
2d150 65 65 64 20 53 51 4c 69 74 65 20 6e 65 76 65 72  eed SQLite never
2d160 20 64 6f 65 73 20 74 68 69 73 2e 20 42 75 74 20   does this. But 
2d170 69 74 20 69 73 0a 20 20 2a 2a 20 6e 69 63 65 20  it is.  ** nice 
2d180 74 6f 20 68 61 76 65 20 74 68 69 73 20 64 65 66  to have this def
2d190 65 6e 73 69 76 65 20 74 65 73 74 20 68 65 72 65  ensive test here
2d1a0 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2f 0a 20 20   anyway..  */.  
2d1b0 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
2d1c0 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
2d1d0 53 45 52 56 45 44 29 20 29 20 72 65 74 75 72 6e  SERVED) ) return
2d1e0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a   SQLITE_ERROR;..
2d1f0 20 20 2f 2a 20 41 6e 20 6f 70 74 69 6d 69 7a 61    /* An optimiza
2d200 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 64 61 74  tion. If the dat
2d210 61 62 61 73 65 20 77 61 73 20 6e 6f 74 20 61 63  abase was not ac
2d220 74 75 61 6c 6c 79 20 6d 6f 64 69 66 69 65 64 20  tually modified 
2d230 64 75 72 69 6e 67 0a 20 20 2a 2a 20 74 68 69 73  during.  ** this
2d240 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
2d250 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
2d260 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ng in exclusive-
2d270 6d 6f 64 65 20 61 6e 64 20 69 73 0a 20 20 2a 2a  mode and is.  **
2d280 20 75 73 69 6e 67 20 70 65 72 73 69 73 74 65 6e   using persisten
2d290 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e  t journals, then
2d2a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2d2b0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a  s a no-op..  **.
2d2c0 20 20 2a 2a 20 54 68 65 20 73 74 61 72 74 20 6f    ** The start o
2d2d0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
2d2e0 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  le currently con
2d2f0 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 6a  tains a single j
2d300 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61  ournal .  ** hea
2d310 64 65 72 20 77 69 74 68 20 74 68 65 20 6e 52 65  der with the nRe
2d320 63 20 66 69 65 6c 64 20 73 65 74 20 74 6f 20 30  c field set to 0
2d330 2e 20 49 66 20 73 75 63 68 20 61 20 6a 6f 75 72  . If such a jour
2d340 6e 61 6c 20 69 73 20 75 73 65 64 20 61 73 0a 20  nal is used as. 
2d350 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
2d360 6c 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75  l during hot-jou
2d370 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 30  rnal rollback, 0
2d380 20 63 68 61 6e 67 65 73 20 77 69 6c 6c 20 62 65   changes will be
2d390 20 6d 61 64 65 0a 20 20 2a 2a 20 74 6f 20 74 68   made.  ** to th
2d3a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2d3b0 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20   So there is no 
2d3c0 6e 65 65 64 20 74 6f 20 7a 65 72 6f 20 74 68 65  need to zero the
2d3d0 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68   journal .  ** h
2d3e0 65 61 64 65 72 2e 20 53 69 6e 63 65 20 74 68 65  eader. Since the
2d3f0 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63   pager is in exc
2d400 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65  lusive mode, the
2d410 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20  re is no need.  
2d420 2a 2a 20 74 6f 20 64 72 6f 70 20 61 6e 79 20 6c  ** to drop any l
2d430 6f 63 6b 73 20 65 69 74 68 65 72 2e 0a 20 20 2a  ocks either..  *
2d440 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
2d450 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26 26  dbModified==0 &&
2d460 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
2d470 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 70 50  veMode .   && pP
2d480 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2d490 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
2d4a0 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 29  MODE_PERSIST.  )
2d4b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2d4c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2d4d0 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
2d4e0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
2d4f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2d500 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
2d510 41 43 45 28 28 22 43 4f 4d 4d 49 54 20 25 64 5c  ACE(("COMMIT %d\
2d520 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
2d530 65 72 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28  er)));.  assert(
2d540 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
2d550 50 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20  PAGER_SYNCED || 
2d560 4d 45 4d 44 42 20 7c 7c 20 21 70 50 61 67 65 72  MEMDB || !pPager
2d570 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 3b 0a  ->dbModified );.
2d580 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
2d590 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
2d5a0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74  ger, pPager->set
2d5b0 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
2d5c0 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
2d5d0 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  ager, rc);.}../*
2d5e0 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
2d5f0 20 63 68 61 6e 67 65 73 2e 20 54 68 65 20 64 61   changes. The da
2d600 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63  tabase falls bac
2d610 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45  k to PAGER_SHARE
2d620 44 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  D mode..**.** Th
2d630 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66  is function perf
2d640 6f 72 6d 73 20 74 77 6f 20 74 61 73 6b 73 3a 0a  orms two tasks:.
2d650 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 74 20 72 6f  **.**   1) It ro
2d660 6c 6c 73 20 62 61 63 6b 20 74 68 65 20 6a 6f 75  lls back the jou
2d670 72 6e 61 6c 20 66 69 6c 65 2c 20 72 65 73 74 6f  rnal file, resto
2d680 72 69 6e 67 20 61 6c 6c 20 64 61 74 61 62 61 73  ring all databas
2d690 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 20  e file and .**  
2d6a0 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61      in-memory ca
2d6b0 63 68 65 20 70 61 67 65 73 20 74 6f 20 74 68 65  che pages to the
2d6c0 20 73 74 61 74 65 20 74 68 65 79 20 77 65 72 65   state they were
2d6d0 20 69 6e 20 77 68 65 6e 20 74 68 65 20 74 72 61   in when the tra
2d6e0 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  nsaction.**     
2d6f0 20 77 61 73 20 6f 70 65 6e 65 64 2c 20 61 6e 64   was opened, and
2d700 0a 2a 2a 20 20 20 32 29 20 49 74 20 66 69 6e 61  .**   2) It fina
2d710 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e 61  lizes the journa
2d720 6c 20 66 69 6c 65 2c 20 73 6f 20 74 68 61 74 20  l file, so that 
2d730 69 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 66  it is not used f
2d740 6f 72 20 68 6f 74 0a 2a 2a 20 20 20 20 20 20 72  or hot.**      r
2d750 6f 6c 6c 62 61 63 6b 20 61 74 20 61 6e 79 20 70  ollback at any p
2d760 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
2d770 72 65 2e 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 65 63  re..**.** subjec
2d780 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t to the followi
2d790 6e 67 20 71 75 61 6c 69 66 69 63 61 74 69 6f 6e  ng qualification
2d7a0 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68  s:.**.** * If th
2d7b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2d7c0 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 20 77  s not yet open w
2d7d0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
2d7e0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20  n is called,.** 
2d7f0 20 20 74 68 65 6e 20 6f 6e 6c 79 20 28 32 29 20    then only (2) 
2d800 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 49 6e  is performed. In
2d810 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
2d820 20 69 73 20 6e 6f 20 6a 6f 75 72 6e 61 6c 20 66   is no journal f
2d830 69 6c 65 0a 2a 2a 20 20 20 74 6f 20 72 6f 6c 6c  ile.**   to roll
2d840 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49   back..**.** * I
2d850 66 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74  f in an error st
2d860 61 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53  ate other than S
2d870 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 74 68 65 6e  QLITE_FULL, then
2d880 20 74 61 73 6b 20 28 31 29 20 69 73 20 0a 2a 2a   task (1) is .**
2d890 20 20 20 70 65 72 66 6f 72 6d 65 64 2e 20 49 66     performed. If
2d8a0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 61 73   successful, tas
2d8b0 6b 20 28 32 29 2e 20 52 65 67 61 72 64 6c 65 73  k (2). Regardles
2d8c0 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65  s of the outcome
2d8d0 0a 2a 2a 20 20 20 6f 66 20 65 69 74 68 65 72 2c  .**   of either,
2d8e0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2d8f0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
2d900 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
2d910 61 6c 6c 65 72 0a 2a 2a 20 20 20 28 69 2e 65 2e  aller.**   (i.e.
2d920 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 49   either SQLITE_I
2d930 4f 45 52 52 20 6f 72 20 53 51 4c 49 54 45 5f 43  OERR or SQLITE_C
2d940 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 2a  ORRUPT)..**.** *
2d950 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
2d960 20 69 6e 20 50 41 47 45 52 5f 52 45 53 45 52 56   in PAGER_RESERV
2d970 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 61  ED state, then a
2d980 74 74 65 6d 70 74 20 28 31 29 2e 20 57 68 65 74  ttempt (1). Whet
2d990 68 65 72 0a 2a 2a 20 20 20 6f 72 20 6e 6f 74 20  her.**   or not 
2d9a0 28 31 29 20 69 73 20 73 75 63 63 75 73 73 66 75  (1) is succussfu
2d9b0 6c 2c 20 61 6c 73 6f 20 61 74 74 65 6d 70 74 20  l, also attempt 
2d9c0 28 32 29 2e 20 49 66 20 73 75 63 63 65 73 73 66  (2). If successf
2d9d0 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20  ul, return.**   
2d9e0 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72  SQLITE_OK. Other
2d9f0 77 69 73 65 2c 20 65 6e 74 65 72 20 74 68 65 20  wise, enter the 
2da00 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20  error state and 
2da10 72 65 74 75 72 6e 20 74 68 65 20 66 69 72 73 74  return the first
2da20 20 0a 2a 2a 20 20 20 65 72 72 6f 72 20 63 6f 64   .**   error cod
2da30 65 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20 0a  e encountered. .
2da40 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74 68 69 73 20  **.**   In this 
2da50 63 61 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f  case there is no
2da60 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
2da70 20 64 61 74 61 62 61 73 65 20 77 61 73 20 77 72   database was wr
2da80 69 74 74 65 6e 20 74 6f 2e 20 0a 2a 2a 20 20 20  itten to. .**   
2da90 53 6f 20 69 73 20 73 61 66 65 20 74 6f 20 66 69  So is safe to fi
2daa0 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
2dab0 61 6c 20 66 69 6c 65 20 65 76 65 6e 20 69 66 20  al file even if 
2dac0 74 68 65 20 70 6c 61 79 62 61 63 6b 20 0a 2a 2a  the playback .**
2dad0 20 20 20 28 6f 70 65 72 61 74 69 6f 6e 20 31 29     (operation 1)
2dae0 20 66 61 69 6c 65 64 2e 20 48 6f 77 65 76 65 72   failed. However
2daf0 20 74 68 65 20 70 61 67 65 72 20 6d 75 73 74 20   the pager must 
2db00 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20  enter the error 
2db10 73 74 61 74 65 0a 2a 2a 20 20 20 61 73 20 74 68  state.**   as th
2db20 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2db30 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
2db40 65 20 61 72 65 20 6e 6f 77 20 73 75 73 70 65 63  e are now suspec
2db50 74 2e 0a 2a 2a 0a 2a 2a 20 2a 20 46 69 6e 61 6c  t..**.** * Final
2db60 6c 79 2c 20 69 66 20 69 6e 20 50 41 47 45 52 5f  ly, if in PAGER_
2db70 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c  EXCLUSIVE state,
2db80 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28 31   then attempt (1
2db90 29 2e 20 4f 6e 6c 79 0a 2a 2a 20 20 20 61 74 74  ). Only.**   att
2dba0 65 6d 70 74 20 28 32 29 20 69 66 20 28 31 29 20  empt (2) if (1) 
2dbb0 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 52  is successful. R
2dbc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
2dbd0 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a  if successful,.*
2dbe0 2a 20 20 20 6f 74 68 65 72 77 69 73 65 20 65 6e  *   otherwise en
2dbf0 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ter the error st
2dc00 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ate and return t
2dc10 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72  he error code fr
2dc20 6f 6d 20 74 68 65 20 0a 2a 2a 20 20 20 66 61 69  om the .**   fai
2dc30 6c 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  ling operation..
2dc40 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74 68 69 73 20  **.**   In this 
2dc50 63 61 73 65 20 74 68 65 20 64 61 74 61 62 61 73  case the databas
2dc60 65 20 66 69 6c 65 20 6d 61 79 20 68 61 76 65 20  e file may have 
2dc70 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2e  been written to.
2dc80 20 53 6f 20 69 66 20 74 68 65 0a 2a 2a 20 20 20   So if the.**   
2dc90 70 6c 61 79 62 61 63 6b 20 6f 70 65 72 61 74 69  playback operati
2dca0 6f 6e 20 64 69 64 20 6e 6f 74 20 73 75 63 63 65  on did not succe
2dcb0 65 64 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 20  ed it would not 
2dcc0 62 65 20 73 61 66 65 20 74 6f 20 66 69 6e 61 6c  be safe to final
2dcd0 69 7a 65 0a 2a 2a 20 20 20 74 68 65 20 6a 6f 75  ize.**   the jou
2dce0 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 6e 65  rnal file. It ne
2dcf0 65 64 73 20 74 6f 20 62 65 20 6c 65 66 74 20 69  eds to be left i
2dd00 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
2dd10 6d 20 73 6f 20 74 68 61 74 0a 2a 2a 20 20 20 73  m so that.**   s
2dd20 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
2dd30 73 20 63 61 6e 20 75 73 65 20 69 74 20 74 6f 20  s can use it to 
2dd40 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
2dd50 62 61 73 65 20 73 74 61 74 65 20 28 62 79 0a 2a  base state (by.*
2dd60 2a 20 20 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  *   hot-journal 
2dd70 72 6f 6c 6c 62 61 63 6b 29 2e 0a 2a 2f 0a 69 6e  rollback)..*/.in
2dd80 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  t sqlite3PagerRo
2dd90 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
2dda0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
2ddb0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2ddc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ddd0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2dde0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 52    PAGERTRACE(("R
2ddf0 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50  OLLBACK %d\n", P
2de00 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
2de10 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
2de20 3e 64 62 4d 6f 64 69 66 69 65 64 20 7c 7c 20 21  >dbModified || !
2de30 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2de40 66 64 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  fd) ){.    rc = 
2de50 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
2de60 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50  ction(pPager, pP
2de70 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29  ager->setMaster)
2de80 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
2de90 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26  ager->errCode &&
2dea0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2deb0 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b  !=SQLITE_FULL ){
2dec0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
2ded0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
2dee0 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20  CLUSIVE ){.     
2def0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
2df00 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
2df10 7d 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  }.    rc = pPage
2df20 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65  r->errCode;.  }e
2df30 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61  lse{.    if( pPa
2df40 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
2df50 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
2df60 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20      int rc2;.   
2df70 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
2df80 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30  ayback(pPager, 0
2df90 29 3b 0a 20 20 20 20 20 20 72 63 32 20 3d 20 70  );.      rc2 = p
2dfa0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
2dfb0 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61  tion(pPager, pPa
2dfc0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b  ger->setMaster);
2dfd0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2dfe0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2dff0 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
2e000 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2e010 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2e020 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
2e030 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  r, 0);.    }..  
2e040 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
2e050 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
2e060 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20  SizeValid = 0;. 
2e070 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
2e080 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
2e090 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43  during a ROLLBAC
2e0a0 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e  K, we can no lon
2e0b0 67 65 72 20 74 72 75 73 74 20 74 68 65 20 70 61  ger trust the pa
2e0c0 67 65 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65  ger.    ** cache
2e0d0 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f  . So call pager_
2e0e0 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77  error() on the w
2e0f0 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61  ay out to make a
2e100 6e 79 20 65 72 72 6f 72 20 0a 20 20 20 20 2a 2a  ny error .    **
2e110 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 20   persistent..   
2e120 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
2e130 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
2e140 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75   rc);.  }.  retu
2e150 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2e160 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
2e170 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e180 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d   is opened read-
2e190 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41  only.  Return FA
2e1a0 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61  LSE.** if the da
2e1b0 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68  tabase is (in th
2e1c0 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a  eory) writable..
2e1d0 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 50 61 67  */.u8 sqlite3Pag
2e1e0 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50 61 67  erIsreadonly(Pag
2e1f0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
2e200 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65  eturn pPager->re
2e210 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  adOnly;.}../*.**
2e220 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
2e230 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
2e240 20 74 6f 20 74 68 65 20 70 61 67 65 72 2e 0a 2a   to the pager..*
2e250 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2e260 65 72 52 65 66 63 6f 75 6e 74 28 50 61 67 65 72  erRefcount(Pager
2e270 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
2e280 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68  urn sqlite3Pcach
2e290 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
2e2a0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f  ->pPCache);.}../
2e2b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2e2c0 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
2e2d0 6e 63 65 73 20 74 6f 20 74 68 65 20 73 70 65 63  nces to the spec
2e2e0 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 69  ified page..*/.i
2e2f0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  nt sqlite3PagerP
2e300 61 67 65 52 65 66 63 6f 75 6e 74 28 44 62 50 61  ageRefcount(DbPa
2e310 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  ge *pPage){.  re
2e320 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63  turn sqlite3Pcac
2e330 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  hePageRefcount(p
2e340 50 61 67 65 29 3b 0a 7d 0a 0a 23 69 66 64 65 66  Page);.}..#ifdef
2e350 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
2e360 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2e370 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
2e380 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
2e390 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73   only..*/.int *s
2e3a0 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74 73  qlite3PagerStats
2e3b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2e3c0 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b  .  static int a[
2e3d0 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 73 71  11];.  a[0] = sq
2e3e0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
2e3f0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
2e400 63 68 65 29 3b 0a 20 20 61 5b 31 5d 20 3d 20 73  che);.  a[1] = s
2e410 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
2e420 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
2e430 43 61 63 68 65 29 3b 0a 20 20 61 5b 32 5d 20 3d  Cache);.  a[2] =
2e440 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 47 65   sqlite3PcacheGe
2e450 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65  tCachesize(pPage
2e460 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61  r->pPCache);.  a
2e470 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  [3] = pPager->db
2e480 53 69 7a 65 56 61 6c 69 64 20 3f 20 28 69 6e 74  SizeValid ? (int
2e490 29 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ) pPager->dbSize
2e4a0 20 3a 20 2d 31 3b 0a 20 20 61 5b 34 5d 20 3d 20   : -1;.  a[4] = 
2e4b0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20  pPager->state;. 
2e4c0 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[5] = pPager->
2e4d0 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20  errCode;.  a[6] 
2e4e0 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a  = pPager->nHit;.
2e4f0 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d    a[7] = pPager-
2e500 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d  >nMiss;.  a[8] =
2e510 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f 20   0;  /* Used to 
2e520 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c  be pPager->nOvfl
2e530 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61   */.  a[9] = pPa
2e540 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b  ger->nRead;.  a[
2e550 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57  10] = pPager->nW
2e560 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 61  rite;.  return a
2e570 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
2e580 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
2e590 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
2e5a0 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a 2a 2f 0a  emory pager..*/.
2e5b0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2e5c0 49 73 4d 65 6d 64 62 28 50 61 67 65 72 20 2a 70  IsMemdb(Pager *p
2e5d0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
2e5e0 20 4d 45 4d 44 42 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   MEMDB;.}../*.**
2e5f0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 72   Check that ther
2e600 65 20 61 72 65 20 61 74 20 6c 65 61 73 74 20 6e  e are at least n
2e610 53 61 76 65 70 6f 69 6e 74 20 73 61 76 65 70 6f  Savepoint savepo
2e620 69 6e 74 73 20 6f 70 65 6e 2e 20 49 66 20 74 68  ints open. If th
2e630 65 72 65 20 61 72 65 0a 2a 2a 20 63 75 72 72 65  ere are.** curre
2e640 6e 74 6c 79 20 6c 65 73 73 20 74 68 61 6e 20 6e  ntly less than n
2e650 53 61 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2c  Savepoints open,
2e660 20 74 68 65 6e 20 6f 70 65 6e 20 6f 6e 65 20 6f   then open one o
2e670 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74  r more savepoint
2e680 73 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 75 70 20  s.** to make up 
2e690 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 2e 20  the difference. 
2e6a0 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
2e6b0 20 73 61 76 65 70 6f 69 6e 74 73 20 69 73 20 61   savepoints is a
2e6c0 6c 72 65 61 64 79 0a 2a 2a 20 65 71 75 61 6c 20  lready.** equal 
2e6d0 74 6f 20 6e 53 61 76 65 70 6f 69 6e 74 2c 20 74  to nSavepoint, t
2e6e0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
2e6f0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
2e700 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
2e710 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
2e720 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  , SQLITE_NOMEM i
2e730 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
2e740 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  n error .** occu
2e750 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67  rs while opening
2e760 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2e770 20 66 69 6c 65 2c 20 74 68 65 6e 20 61 6e 20 49   file, then an I
2e780 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 0a  O error code is.
2e790 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  ** returned. Oth
2e7a0 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
2e7b0 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
2e7c0 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
2e7d0 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
2e7e0 72 2c 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e  r, int nSavepoin
2e7f0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
2e800 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2e810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e820 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2e830 2f 0a 20 20 69 6e 74 20 6e 43 75 72 72 65 6e 74  /.  int nCurrent
2e840 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65   = pPager->nSave
2e850 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a  point;        /*
2e860 20 43 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20   Current number 
2e870 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f  of savepoints */
2e880 0a 0a 20 20 69 66 28 20 6e 53 61 76 65 70 6f 69  ..  if( nSavepoi
2e890 6e 74 3e 6e 43 75 72 72 65 6e 74 20 26 26 20 70  nt>nCurrent && p
2e8a0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
2e8b0 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b  l ){.    int ii;
2e8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e8e0 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
2e8f0 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 50 61 67  iable */.    Pag
2e900 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 4e 65  erSavepoint *aNe
2e910 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
2e920 20 20 20 20 20 2f 2a 20 4e 65 77 20 50 61 67 65       /* New Page
2e930 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72 72  r.aSavepoint arr
2e940 61 79 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 69  ay */..    /* Ei
2e950 74 68 65 72 20 74 68 65 72 65 20 69 73 20 6e 6f  ther there is no
2e960 20 61 63 74 69 76 65 20 6a 6f 75 72 6e 61 6c 20   active journal 
2e970 6f 72 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  or the sub-journ
2e980 61 6c 20 69 73 20 6f 70 65 6e 20 6f 72 20 0a 20  al is open or . 
2e990 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
2e9a0 6c 20 69 73 20 61 6c 77 61 79 73 20 73 74 6f 72  l is always stor
2e9b0 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 2a 2f 0a  ed in memory */.
2e9c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2e9d0 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d  er->nSavepoint==
2e9e0 30 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  0 || isOpen(pPag
2e9f0 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 0a 20 20 20  er->sjfd) ||.   
2ea00 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
2ea10 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
2ea20 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2ea30 4d 45 4d 4f 52 59 20 29 3b 0a 0a 20 20 20 20 2f  MEMORY );..    /
2ea40 2a 20 47 72 6f 77 20 74 68 65 20 50 61 67 65 72  * Grow the Pager
2ea50 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72 72 61  .aSavepoint arra
2ea60 79 20 75 73 69 6e 67 20 72 65 61 6c 6c 6f 63 28  y using realloc(
2ea70 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ). Return SQLITE
2ea80 5f 4e 4f 4d 45 4d 0a 20 20 20 20 2a 2a 20 69 66  _NOMEM.    ** if
2ea90 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
2eaa0 66 61 69 6c 73 2e 20 4f 74 68 65 72 77 69 73 65  fails. Otherwise
2eab0 2c 20 7a 65 72 6f 20 74 68 65 20 6e 65 77 20 70  , zero the new p
2eac0 6f 72 74 69 6f 6e 20 69 6e 20 63 61 73 65 20 61  ortion in case a
2ead0 20 0a 20 20 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20   .    ** malloc 
2eae0 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
2eaf0 68 69 6c 65 20 70 6f 70 75 6c 61 74 69 6e 67 20  hile populating 
2eb00 69 74 20 69 6e 20 74 68 65 20 66 6f 72 28 2e 2e  it in the for(..
2eb10 2e 29 20 6c 6f 6f 70 20 62 65 6c 6f 77 2e 0a 20  .) loop below.. 
2eb20 20 20 20 2a 2f 0a 20 20 20 20 61 4e 65 77 20 3d     */.    aNew =
2eb30 20 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74   (PagerSavepoint
2eb40 20 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f   *)sqlite3Reallo
2eb50 63 28 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  c(.        pPage
2eb60 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 2c 20 73  r->aSavepoint, s
2eb70 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76 65 70  izeof(PagerSavep
2eb80 6f 69 6e 74 29 2a 6e 53 61 76 65 70 6f 69 6e 74  oint)*nSavepoint
2eb90 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
2eba0 21 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72  !aNew ){.      r
2ebb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2ebc0 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  EM;.    }.    me
2ebd0 6d 73 65 74 28 26 61 4e 65 77 5b 6e 43 75 72 72  mset(&aNew[nCurr
2ebe0 65 6e 74 5d 2c 20 30 2c 20 28 6e 53 61 76 65 70  ent], 0, (nSavep
2ebf0 6f 69 6e 74 2d 6e 43 75 72 72 65 6e 74 29 20 2a  oint-nCurrent) *
2ec00 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76   sizeof(PagerSav
2ec10 65 70 6f 69 6e 74 29 29 3b 0a 20 20 20 20 70 50  epoint));.    pP
2ec20 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
2ec30 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 70 50 61   = aNew;.    pPa
2ec40 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  ger->nSavepoint 
2ec50 3d 20 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 0a 20  = nSavepoint;.. 
2ec60 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
2ec70 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
2ec80 74 20 73 74 72 75 63 74 75 72 65 73 20 6a 75 73  t structures jus
2ec90 74 20 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a  t allocated. */.
2eca0 20 20 20 20 66 6f 72 28 69 69 3d 6e 43 75 72 72      for(ii=nCurr
2ecb0 65 6e 74 3b 20 69 69 3c 6e 53 61 76 65 70 6f 69  ent; ii<nSavepoi
2ecc0 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  nt; ii++){.     
2ecd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2ece0 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a  >dbSizeValid );.
2ecf0 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 6e        aNew[ii].n
2ed00 4f 72 69 67 20 3d 20 70 50 61 67 65 72 2d 3e 64  Orig = pPager->d
2ed10 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  bSize;.      if(
2ed20 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2ed30 6a 66 64 29 20 26 26 20 41 4c 57 41 59 53 28 70  jfd) && ALWAYS(p
2ed40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
2ed50 66 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  f>0) ){.        
2ed60 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74  aNew[ii].iOffset
2ed70 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
2ed80 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c  alOff;.      }el
2ed90 73 65 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77  se{.        aNew
2eda0 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 4a  [ii].iOffset = J
2edb0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
2edc0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
2edd0 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 53       aNew[ii].iS
2ede0 75 62 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e  ubRec = pPager->
2edf0 6e 53 75 62 52 65 63 3b 0a 20 20 20 20 20 20 61  nSubRec;.      a
2ee00 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  New[ii].pInSavep
2ee10 6f 69 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69  oint = sqlite3Bi
2ee20 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65  tvecCreate(pPage
2ee30 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20  r->dbSize);.    
2ee40 20 20 69 66 28 20 21 61 4e 65 77 5b 69 69 5d 2e    if( !aNew[ii].
2ee50 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  pInSavepoint ){.
2ee60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2ee70 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2ee80 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2ee90 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d  /* Open the sub-
2eea0 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
2eeb0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
2eec0 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 72 63 20  ened. */.    rc 
2eed0 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  = openSubJournal
2eee0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73  (pPager);.    as
2eef0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
2ef00 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 3b 0a  traint(pPager);.
2ef10 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
2ef20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2ef30 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2ef40 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f  ed to rollback o
2ef50 72 20 72 65 6c 65 61 73 65 20 28 63 6f 6d 6d 69  r release (commi
2ef60 74 29 20 61 20 73 61 76 65 70 6f 69 6e 74 2e 0a  t) a savepoint..
2ef70 2a 2a 20 54 68 65 20 73 61 76 65 70 6f 69 6e 74  ** The savepoint
2ef80 20 74 6f 20 72 65 6c 65 61 73 65 20 6f 72 20 72   to release or r
2ef90 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 20 6e 6f 74  ollback need not
2efa0 20 62 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63   be the most rec
2efb0 65 6e 74 6c 79 20 0a 2a 2a 20 63 72 65 61 74 65  ently .** create
2efc0 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a  d savepoint..**.
2efd0 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6f 70 20  ** Parameter op 
2efe0 69 73 20 61 6c 77 61 79 73 20 65 69 74 68 65 72  is always either
2eff0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
2f000 41 43 4b 20 6f 72 20 53 41 56 45 50 4f 49 4e 54  ACK or SAVEPOINT
2f010 5f 52 45 4c 45 41 53 45 2e 0a 2a 2a 20 49 66 20  _RELEASE..** If 
2f020 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  it is SAVEPOINT_
2f030 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 72 65  RELEASE, then re
2f040 6c 65 61 73 65 20 61 6e 64 20 64 65 73 74 72 6f  lease and destro
2f050 79 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  y the savepoint 
2f060 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 69 53  with.** index iS
2f070 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 74 20  avepoint. If it 
2f080 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  is SAVEPOINT_ROL
2f090 4c 42 41 43 4b 2c 20 74 68 65 6e 20 72 6f 6c 6c  LBACK, then roll
2f0a0 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73  back all changes
2f0b0 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 6f 63  .** that have oc
2f0c0 63 75 72 72 65 64 20 73 69 6e 63 65 20 74 68 65  curred since the
2f0d0 20 73 70 65 63 69 66 69 65 64 20 73 61 76 65 70   specified savep
2f0e0 6f 69 6e 74 20 77 61 73 20 63 72 65 61 74 65 64  oint was created
2f0f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 76 65  ..**.** The save
2f100 70 6f 69 6e 74 20 74 6f 20 72 6f 6c 6c 62 61 63  point to rollbac
2f110 6b 20 6f 72 20 72 65 6c 65 61 73 65 20 69 73 20  k or release is 
2f120 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
2f130 72 61 6d 65 74 65 72 20 0a 2a 2a 20 69 53 61 76  rameter .** iSav
2f140 65 70 6f 69 6e 74 2e 20 41 20 76 61 6c 75 65 20  epoint. A value 
2f150 6f 66 20 30 20 6d 65 61 6e 73 20 74 6f 20 6f 70  of 0 means to op
2f160 65 72 61 74 65 20 6f 6e 20 74 68 65 20 6f 75 74  erate on the out
2f170 65 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e 74  ermost savepoint
2f180 0a 2a 2a 20 28 74 68 65 20 66 69 72 73 74 20 63  .** (the first c
2f190 72 65 61 74 65 64 29 2e 20 41 20 76 61 6c 75 65  reated). A value
2f1a0 20 6f 66 20 28 50 61 67 65 72 2e 6e 53 61 76 65   of (Pager.nSave
2f1b0 70 6f 69 6e 74 2d 31 29 20 6d 65 61 6e 73 20 6f  point-1) means o
2f1c0 70 65 72 61 74 65 0a 2a 2a 20 6f 6e 20 74 68 65  perate.** on the
2f1d0 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
2f1e0 72 65 61 74 65 64 20 73 61 76 65 70 6f 69 6e 74  reated savepoint
2f1f0 2e 20 49 66 20 69 53 61 76 65 70 6f 69 6e 74 20  . If iSavepoint 
2f200 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a  is greater than.
2f210 2a 2a 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70  ** (Pager.nSavep
2f220 6f 69 6e 74 2d 31 29 2c 20 74 68 65 6e 20 74 68  oint-1), then th
2f230 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
2f240 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
2f250 20 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75   a negative valu
2f260 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74  e is passed to t
2f270 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  his function, th
2f280 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  en the current.*
2f290 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
2f2a0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68   rolled back. Th
2f2b0 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  is is different 
2f2c0 74 6f 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73  to calling .** s
2f2d0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
2f2e0 61 63 6b 28 29 20 62 65 63 61 75 73 65 20 74 68  ack() because th
2f2f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
2f300 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 0a 2a   not terminate.*
2f310 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
2f320 6e 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 20  n or unlock the 
2f330 64 61 74 61 62 61 73 65 2c 20 69 74 20 6a 75 73  database, it jus
2f340 74 20 72 65 73 74 6f 72 65 73 20 74 68 65 20 0a  t restores the .
2f350 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
2f360 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
2f370 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
2f380 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 79  e. .**.** In any
2f390 20 63 61 73 65 2c 20 61 6c 6c 20 73 61 76 65 70   case, all savep
2f3a0 6f 69 6e 74 73 20 77 69 74 68 20 61 6e 20 69 6e  oints with an in
2f3b0 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e  dex greater than
2f3c0 20 69 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20   iSavepoint .** 
2f3d0 61 72 65 20 64 65 73 74 72 6f 79 65 64 2e 20 49  are destroyed. I
2f3e0 66 20 74 68 69 73 20 69 73 20 61 20 72 65 6c 65  f this is a rele
2f3f0 61 73 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6f  ase operation (o
2f400 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
2f410 45 41 53 45 29 2c 0a 2a 2a 20 74 68 65 6e 20 73  EASE),.** then s
2f420 61 76 65 70 6f 69 6e 74 20 69 53 61 76 65 70 6f  avepoint iSavepo
2f430 69 6e 74 20 69 73 20 61 6c 73 6f 20 64 65 73 74  int is also dest
2f440 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  royed..**.** Thi
2f450 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72  s function may r
2f460 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2f470 45 4d 20 69 66 20 61 20 6d 65 6d 6f 72 79 20 61  EM if a memory a
2f480 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
2f490 0a 2a 2a 20 6f 72 20 61 6e 20 49 4f 20 65 72 72  .** or an IO err
2f4a0 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 49 4f  or code if an IO
2f4b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
2f4c0 69 6c 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  ile rolling back
2f4d0 20 61 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74   a .** savepoint
2f4e0 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 73 20 6f  . If no errors o
2f4f0 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ccur, SQLITE_OK 
2f500 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 20  is returned..*/ 
2f510 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2f520 72 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72  rSavepoint(Pager
2f530 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6f 70   *pPager, int op
2f540 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  , int iSavepoint
2f550 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2f560 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
2f570 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e  rt( op==SAVEPOIN
2f580 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d  T_RELEASE || op=
2f590 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
2f5a0 41 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ACK );.  assert(
2f5b0 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c   iSavepoint>=0 |
2f5c0 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  | op==SAVEPOINT_
2f5d0 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 0a 20 20 69  ROLLBACK );..  i
2f5e0 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 70 50  f( iSavepoint<pP
2f5f0 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
2f600 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 20   ){.    int ii; 
2f610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
2f620 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
2f630 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 3b  */.    int nNew;
2f640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2f650 62 65 72 20 6f 66 20 72 65 6d 61 69 6e 69 6e 67  ber of remaining
2f660 20 73 61 76 65 70 6f 69 6e 74 73 20 61 66 74 65   savepoints afte
2f670 72 20 74 68 69 73 20 6f 70 2e 20 2a 2f 0a 0a 20  r this op. */.. 
2f680 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
2f690 20 68 6f 77 20 6d 61 6e 79 20 73 61 76 65 70 6f   how many savepo
2f6a0 69 6e 74 73 20 77 69 6c 6c 20 73 74 69 6c 6c 20  ints will still 
2f6b0 62 65 20 61 63 74 69 76 65 20 61 66 74 65 72 20  be active after 
2f6c0 74 68 69 73 0a 20 20 20 20 2a 2a 20 6f 70 65 72  this.    ** oper
2f6d0 61 74 69 6f 6e 2e 20 53 74 6f 72 65 20 74 68 69  ation. Store thi
2f6e0 73 20 76 61 6c 75 65 20 69 6e 20 6e 4e 65 77 2e  s value in nNew.
2f6f0 20 54 68 65 6e 20 66 72 65 65 20 72 65 73 6f 75   Then free resou
2f700 72 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  rces associated 
2f710 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e 79  .    ** with any
2f720 20 73 61 76 65 70 6f 69 6e 74 73 20 74 68 61 74   savepoints that
2f730 20 61 72 65 20 64 65 73 74 72 6f 79 65 64 20 62   are destroyed b
2f740 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
2f750 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 65  ..    */.    nNe
2f760 77 20 3d 20 69 53 61 76 65 70 6f 69 6e 74 20 2b  w = iSavepoint +
2f770 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   (op==SAVEPOINT_
2f780 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 66  ROLLBACK);.    f
2f790 6f 72 28 69 69 3d 6e 4e 65 77 3b 20 69 69 3c 70  or(ii=nNew; ii<p
2f7a0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
2f7b0 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  t; ii++){.      
2f7c0 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
2f7d0 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61  troy(pPager->aSa
2f7e0 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53  vepoint[ii].pInS
2f7f0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d  avepoint);.    }
2f800 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61  .    pPager->nSa
2f810 76 65 70 6f 69 6e 74 20 3d 20 6e 4e 65 77 3b 0a  vepoint = nNew;.
2f820 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
2f830 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70  is a rollback op
2f840 65 72 61 74 69 6f 6e 2c 20 70 6c 61 79 62 61 63  eration, playbac
2f850 6b 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  k the specified 
2f860 73 61 76 65 70 6f 69 6e 74 2e 0a 20 20 20 20 2a  savepoint..    *
2f870 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 74  * If this is a t
2f880 65 6d 70 2d 66 69 6c 65 2c 20 69 74 20 69 73 20  emp-file, it is 
2f890 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 74 68  possible that th
2f8a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
2f8b0 61 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 79 65  as.    ** not ye
2f8c0 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 20 49  t been opened. I
2f8d0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72  n this case ther
2f8e0 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20 63  e have been no c
2f8f0 68 61 6e 67 65 73 20 74 6f 0a 20 20 20 20 2a 2a  hanges to.    **
2f900 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2f910 6c 65 2c 20 73 6f 20 74 68 65 20 70 6c 61 79 62  le, so the playb
2f920 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 63 61  ack operation ca
2f930 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20  n be skipped..  
2f940 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 70 3d    */.    if( op=
2f950 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
2f960 41 43 4b 20 26 26 20 69 73 4f 70 65 6e 28 70 50  ACK && isOpen(pP
2f970 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
2f980 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
2f990 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 20 3d  nt *pSavepoint =
2f9a0 20 28 6e 4e 65 77 3d 3d 30 29 3f 30 3a 26 70 50   (nNew==0)?0:&pP
2f9b0 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
2f9c0 5b 6e 4e 65 77 2d 31 5d 3b 0a 20 20 20 20 20 20  [nNew-1];.      
2f9d0 72 63 20 3d 20 70 61 67 65 72 50 6c 61 79 62 61  rc = pagerPlayba
2f9e0 63 6b 53 61 76 65 70 6f 69 6e 74 28 70 50 61 67  ckSavepoint(pPag
2f9f0 65 72 2c 20 70 53 61 76 65 70 6f 69 6e 74 29 3b  er, pSavepoint);
2fa00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 72 63  .      assert(rc
2fa10 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 29 3b 0a  !=SQLITE_DONE);.
2fa20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
2fa30 49 66 20 74 68 69 73 20 69 73 20 61 20 72 65 6c  If this is a rel
2fa40 65 61 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ease of the oute
2fa50 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e 74 2c  rmost savepoint,
2fa60 20 74 72 75 6e 63 61 74 65 20 0a 20 20 20 20 2a   truncate .    *
2fa70 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
2fa80 6c 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20  l to zero bytes 
2fa90 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a 20 20 20 20  in size. */.    
2faa0 69 66 28 20 6e 4e 65 77 3d 3d 30 20 26 26 20 6f  if( nNew==0 && o
2fab0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
2fac0 45 41 53 45 20 26 26 20 69 73 4f 70 65 6e 28 70  EASE && isOpen(p
2fad0 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
2fae0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
2faf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
2fb00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2fb10 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
2fb20 65 72 2d 3e 73 6a 66 64 2c 20 30 29 3b 0a 20 20  er->sjfd, 0);.  
2fb30 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62      pPager->nSub
2fb40 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Rec = 0;.    }. 
2fb50 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2fb60 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2fb70 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
2fb80 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2fb90 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  e file..*/.const
2fba0 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61   char *sqlite3Pa
2fbb0 67 65 72 46 69 6c 65 6e 61 6d 65 28 50 61 67 65  gerFilename(Page
2fbc0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
2fbd0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69  turn pPager->zFi
2fbe0 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
2fbf0 20 52 65 74 75 72 6e 20 74 68 65 20 56 46 53 20   Return the VFS 
2fc00 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68  structure for th
2fc10 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73  e pager..*/.cons
2fc20 74 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 73  t sqlite3_vfs *s
2fc30 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 50  qlite3PagerVfs(P
2fc40 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2fc50 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
2fc60 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pVfs;.}../*.** R
2fc70 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65 20 68  eturn the file h
2fc80 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 64 61  andle for the da
2fc90 74 61 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f  tabase file asso
2fca0 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
2fcb0 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20  he pager.  This 
2fcc0 6d 69 67 68 74 20 72 65 74 75 72 6e 20 4e 55 4c  might return NUL
2fcd0 4c 20 69 66 20 74 68 65 20 66 69 6c 65 20 68 61  L if the file ha
2fce0 73 0a 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65  s.** not yet bee
2fcf0 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c  n opened..*/.sql
2fd00 69 74 65 33 5f 66 69 6c 65 20 2a 73 71 6c 69 74  ite3_file *sqlit
2fd10 65 33 50 61 67 65 72 46 69 6c 65 28 50 61 67 65  e3PagerFile(Page
2fd20 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
2fd30 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 3b  turn pPager->fd;
2fd40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2fd50 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
2fd60 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  me of the journa
2fd70 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  l file..*/.const
2fd80 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61   char *sqlite3Pa
2fd90 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50  gerJournalname(P
2fda0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2fdb0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
2fdc0 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a  zJournal;.}../*.
2fdd0 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
2fde0 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73 20  f fsync() calls 
2fdf0 61 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72  are disabled for
2fe00 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 52 65   this pager.  Re
2fe10 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
2fe20 20 66 73 79 6e 63 28 29 73 20 61 72 65 20 65 78   fsync()s are ex
2fe30 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e  ecuted normally.
2fe40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2fe50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67 65 72  agerNosync(Pager
2fe60 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
2fe70 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  urn pPager->noSy
2fe80 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  nc;.}..#ifdef SQ
2fe90 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f  LITE_HAS_CODEC./
2fea0 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 72 65 74 72  *.** Set or retr
2feb0 69 65 76 65 20 74 68 65 20 63 6f 64 65 63 20 66  ieve the codec f
2fec0 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f  or this pager.*/
2fed0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
2fee0 69 74 65 33 50 61 67 65 72 53 65 74 43 6f 64 65  ite3PagerSetCode
2fef0 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  c(.  Pager *pPag
2ff00 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43  er,.  void *(*xC
2ff10 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64  odec)(void*,void
2ff20 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76  *,Pgno,int),.  v
2ff30 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65  oid (*xCodecSize
2ff40 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  Chng)(void*,int,
2ff50 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78  int),.  void (*x
2ff60 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a  CodecFree)(void*
2ff70 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  ),.  void *pCode
2ff80 63 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  c.){.  if( pPage
2ff90 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20  r->xCodecFree ) 
2ffa0 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72  pPager->xCodecFr
2ffb0 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  ee(pPager->pCode
2ffc0 63 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43  c);.  pPager->xC
2ffd0 6f 64 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 6d  odec = pPager->m
2ffe0 65 6d 44 62 20 3f 20 30 20 3a 20 78 43 6f 64 65  emDb ? 0 : xCode
2fff0 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  c;.  pPager->xCo
30000 64 65 63 53 69 7a 65 43 68 6e 67 20 3d 20 78 43  decSizeChng = xC
30010 6f 64 65 63 53 69 7a 65 43 68 6e 67 3b 0a 20 20  odecSizeChng;.  
30020 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72  pPager->xCodecFr
30030 65 65 20 3d 20 78 43 6f 64 65 63 46 72 65 65 3b  ee = xCodecFree;
30040 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  .  pPager->pCode
30050 63 20 3d 20 70 43 6f 64 65 63 3b 0a 20 20 70 61  c = pCodec;.  pa
30060 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50  gerReportSize(pP
30070 61 67 65 72 29 3b 0a 7d 0a 73 74 61 74 69 63 20  ager);.}.static 
30080 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
30090 65 72 47 65 74 43 6f 64 65 63 28 50 61 67 65 72  erGetCodec(Pager
300a0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
300b0 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 43 6f 64  urn pPager->pCod
300c0 65 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ec;.}.#endif..#i
300d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
300e0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
300f0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65  ** Move the page
30100 20 70 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e   pPg to location
30110 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c   pgno in the fil
30120 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  e..**.** There m
30130 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65  ust be no refere
30140 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
30150 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61   previously loca
30160 74 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28  ted at.** pgno (
30170 77 68 69 63 68 20 77 65 20 63 61 6c 6c 20 70 50  which we call pP
30180 67 4f 6c 64 29 20 74 68 6f 75 67 68 20 74 68 61  gOld) though tha
30190 74 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 77 65  t page is allowe
301a0 64 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61  d to be.** in ca
301b0 63 68 65 2e 20 20 49 66 20 74 68 65 20 70 61 67  che.  If the pag
301c0 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63  e previously loc
301d0 61 74 65 64 20 61 74 20 70 67 6e 6f 20 69 73 20  ated at pgno is 
301e0 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69  not already.** i
301f0 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
30200 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f  ournal, it is no
30210 74 20 70 75 74 20 74 68 65 72 65 20 62 79 20 62  t put there by b
30220 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  y this routine..
30230 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73  **.** References
30240 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 50 67   to the page pPg
30250 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55   remain valid. U
30260 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d  pdating any.** m
30270 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61  eta-data associa
30280 74 65 64 20 77 69 74 68 20 70 50 67 20 28 69 2e  ted with pPg (i.
30290 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69  e. data stored i
302a0 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74  n the nExtra byt
302b0 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  es.** allocated 
302c0 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70  along with the p
302d0 61 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70  age) is the resp
302e0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
302f0 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
30300 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  A transaction mu
30310 73 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65  st be active whe
30320 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
30330 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65  s called. It use
30340 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69  d to be.** requi
30350 72 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65  red that a state
30360 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
30370 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c   was not active,
30380 20 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69   but this restri
30390 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65  ction.** has bee
303a0 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54  n removed (CREAT
303b0 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f  E INDEX needs to
303c0 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65   move a page whe
303d0 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  n a statement.**
303e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
303f0 61 63 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49  active)..**.** I
30400 66 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67  f the fourth arg
30410 75 6d 65 6e 74 2c 20 69 73 43 6f 6d 6d 69 74 2c  ument, isCommit,
30420 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
30430 65 6e 20 74 68 69 73 20 70 61 67 65 20 69 73 20  en this page is 
30440 62 65 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20 61  being.** moved a
30450 73 20 70 61 72 74 20 6f 66 20 61 20 64 61 74 61  s part of a data
30460 62 61 73 65 20 72 65 6f 72 67 61 6e 69 7a 61 74  base reorganizat
30470 69 6f 6e 20 6a 75 73 74 20 62 65 66 6f 72 65 20  ion just before 
30480 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
30490 0a 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 6f 6d  .** is being com
304a0 6d 69 74 74 65 64 2e 20 49 6e 20 74 68 69 73 20  mitted. In this 
304b0 63 61 73 65 2c 20 69 74 20 69 73 20 67 75 61 72  case, it is guar
304c0 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
304d0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 0a 2a  database page .*
304e0 2a 20 70 50 67 20 72 65 66 65 72 73 20 74 6f 20  * pPg refers to 
304f0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74  will not be writ
30500 74 65 6e 20 74 6f 20 61 67 61 69 6e 20 77 69 74  ten to again wit
30510 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hin this transac
30520 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
30530 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65   function may re
30540 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
30550 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  M or an IO error
30560 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f   code if an erro
30570 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 4f 74 68  r.** occurs. Oth
30580 65 72 77 69 73 65 2c 20 69 74 20 72 65 74 75 72  erwise, it retur
30590 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  ns SQLITE_OK..*/
305a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
305b0 72 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72 20  rMovepage(Pager 
305c0 2a 70 50 61 67 65 72 2c 20 44 62 50 61 67 65 20  *pPager, DbPage 
305d0 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  *pPg, Pgno pgno,
305e0 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 29 7b 0a   int isCommit){.
305f0 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b    PgHdr *pPgOld;
30600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30610 2a 20 54 68 65 20 70 61 67 65 20 62 65 69 6e 67  * The page being
30620 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f   overwritten. */
30630 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63  .  Pgno needSync
30640 50 67 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  Pgno = 0;       
30650 2f 2a 20 4f 6c 64 20 76 61 6c 75 65 20 6f 66 20  /* Old value of 
30660 70 50 67 2d 3e 70 67 6e 6f 2c 20 69 66 20 73 79  pPg->pgno, if sy
30670 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 20 2a  nc is required *
30680 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
30690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
306a0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
306b0 2a 2f 0a 20 20 50 67 6e 6f 20 6f 72 69 67 50 67  */.  Pgno origPg
306c0 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
306d0 20 20 2f 2a 20 54 68 65 20 6f 72 69 67 69 6e 61    /* The origina
306e0 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  l page number */
306f0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ..  assert( pPg-
30700 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a  >nRef>0 );..  /*
30710 20 49 66 20 74 68 65 20 70 61 67 65 20 62 65 69   If the page bei
30720 6e 67 20 6d 6f 76 65 64 20 69 73 20 64 69 72 74  ng moved is dirt
30730 79 20 61 6e 64 20 68 61 73 20 6e 6f 74 20 62 65  y and has not be
30740 65 6e 20 73 61 76 65 64 20 62 79 20 74 68 65 20  en saved by the 
30750 6c 61 74 65 73 74 0a 20 20 2a 2a 20 73 61 76 65  latest.  ** save
30760 70 6f 69 6e 74 2c 20 74 68 65 6e 20 73 61 76 65  point, then save
30770 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
30780 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
30790 65 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 2a 2a  e into the .  **
307a0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6e 6f 77   sub-journal now
307b0 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
307c0 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ed to handle the
307d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65 6e 61   following scena
307e0 72 69 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  rio:.  **.  **  
307f0 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20 20 20   BEGIN;.  **    
30800 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58   <journal page X
30810 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 20 69 74  , then modify it
30820 20 69 6e 20 6d 65 6d 6f 72 79 3e 0a 20 20 2a 2a   in memory>.  **
30830 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f       SAVEPOINT o
30840 6e 65 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c  ne;.  **       <
30850 4d 6f 76 65 20 70 61 67 65 20 58 20 74 6f 20 6c  Move page X to l
30860 6f 63 61 74 69 6f 6e 20 59 3e 0a 20 20 2a 2a 20  ocation Y>.  ** 
30870 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20      ROLLBACK TO 
30880 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  one;.  **.  ** I
30890 66 20 70 61 67 65 20 58 20 77 65 72 65 20 6e 6f  f page X were no
308a0 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  t written to the
308b0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 68 65 72   sub-journal her
308c0 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a  e, it would not.
308d0 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65    ** be possible
308e0 20 74 6f 20 72 65 73 74 6f 72 65 20 69 74 73 20   to restore its 
308f0 63 6f 6e 74 65 6e 74 73 20 77 68 65 6e 20 74 68  contents when th
30900 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f  e "ROLLBACK TO o
30910 6e 65 22 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  ne".  ** stateme
30920 6e 74 20 77 65 72 65 20 69 73 20 70 72 6f 63 65  nt were is proce
30930 73 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ssed..  **.  ** 
30940 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 29  subjournalPage()
30950 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 61 6c 6c   may need to all
30960 6f 63 61 74 65 20 73 70 61 63 65 20 74 6f 20 73  ocate space to s
30970 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69  tore pPg->pgno i
30980 6e 74 6f 0a 20 20 2a 2a 20 6f 6e 65 20 6f 72 20  nto.  ** one or 
30990 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 20 62  more savepoint b
309a0 69 74 76 65 63 73 2e 20 54 68 69 73 20 69 73 20  itvecs. This is 
309b0 74 68 65 20 72 65 61 73 6f 6e 20 74 68 69 73 20  the reason this 
309c0 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6d 61  function.  ** ma
309d0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
309e0 4e 4f 4d 45 4d 2e 0a 20 20 2a 2f 0a 20 20 69 66  NOMEM..  */.  if
309f0 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
30a00 44 52 5f 44 49 52 54 59 20 0a 20 20 20 26 26 20  DR_DIRTY .   && 
30a10 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
30a20 28 70 50 67 29 0a 20 20 20 26 26 20 53 51 4c 49  (pPg).   && SQLI
30a30 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 75 62  TE_OK!=(rc = sub
30a40 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29  journalPage(pPg)
30a50 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
30a60 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47  n rc;.  }..  PAG
30a70 45 52 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25  ERTRACE(("MOVE %
30a80 64 20 70 61 67 65 20 25 64 20 28 6e 65 65 64 53  d page %d (needS
30a90 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f  ync=%d) moves to
30aa0 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50   %d\n", .      P
30ab0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
30ac0 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 70 50 67 2d  pPg->pgno, (pPg-
30ad0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
30ae0 44 5f 53 59 4e 43 29 3f 31 3a 30 2c 20 70 67 6e  D_SYNC)?1:0, pgn
30af0 6f 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  o));.  IOTRACE((
30b00 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e  "MOVE %p %d %d\n
30b10 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
30b20 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20  pgno, pgno))..  
30b30 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  /* If the journa
30b40 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79  l needs to be sy
30b50 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 70 61  nc()ed before pa
30b60 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20 63 61 6e  ge pPg->pgno can
30b70 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e  .  ** be written
30b80 20 74 6f 2c 20 73 74 6f 72 65 20 70 50 67 2d 3e   to, store pPg->
30b90 70 67 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20 76 61  pgno in local va
30ba0 72 69 61 62 6c 65 20 6e 65 65 64 53 79 6e 63 50  riable needSyncP
30bb0 67 6e 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  gno..  **.  ** I
30bc0 66 20 74 68 65 20 69 73 43 6f 6d 6d 69 74 20 66  f the isCommit f
30bd0 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 72  lag is set, ther
30be0 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
30bf0 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 20 20  remember that.  
30c00 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e  ** the journal n
30c10 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28  eeds to be sync(
30c20 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62  )ed before datab
30c30 61 73 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67  ase page pPg->pg
30c40 6e 6f 20 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20  no .  ** can be 
30c50 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20  written to. The 
30c60 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61  caller has alrea
30c70 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20  dy promised not 
30c80 74 6f 20 77 72 69 74 65 20 74 6f 20 69 74 2e 0a  to write to it..
30c90 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 67 2d    */.  if( (pPg-
30ca0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
30cb0 44 5f 53 59 4e 43 29 20 26 26 20 21 69 73 43 6f  D_SYNC) && !isCo
30cc0 6d 6d 69 74 20 29 7b 0a 20 20 20 20 6e 65 65 64  mmit ){.    need
30cd0 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e  SyncPgno = pPg->
30ce0 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74  pgno;.    assert
30cf0 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  ( pageInJournal(
30d00 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  pPg) || pPg->pgn
30d10 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  o>pPager->dbOrig
30d20 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65  Size );.    asse
30d30 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  rt( pPg->flags&P
30d40 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20  GHDR_DIRTY );.  
30d50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
30d60 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20  ->needSync );.  
30d70 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  }..  /* If the c
30d80 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  ache contains a 
30d90 70 61 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e  page with page-n
30da0 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f  umber pgno, remo
30db0 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20  ve it.  ** from 
30dc0 69 74 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20  its hash chain. 
30dd0 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48  Also, if the PgH
30de0 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20  dr.needSync was 
30df0 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61  set for .  ** pa
30e00 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74  ge pgno before t
30e10 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74  he 'move' operat
30e20 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f  ion, it needs to
30e30 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20   be retained .  
30e40 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  ** for the page 
30e50 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a  moved there..  *
30e60 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26  /.  pPg->flags &
30e70 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  = ~PGHDR_NEED_SY
30e80 4e 43 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70  NC;.  pPgOld = p
30e90 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
30ea0 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73  er, pgno);.  ass
30eb0 65 72 74 28 20 21 70 50 67 4f 6c 64 20 7c 7c 20  ert( !pPgOld || 
30ec0 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 31 20  pPgOld->nRef==1 
30ed0 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20  );.  if( pPgOld 
30ee0 29 7b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  ){.    pPg->flag
30ef0 73 20 7c 3d 20 28 70 50 67 4f 6c 64 2d 3e 66 6c  s |= (pPgOld->fl
30f00 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
30f10 59 4e 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  YNC);.    sqlite
30f20 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 4f  3PcacheDrop(pPgO
30f30 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20 6f 72 69 67  ld);.  }..  orig
30f40 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Pgno = pPg->pgno
30f50 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
30f60 65 4d 6f 76 65 28 70 50 67 2c 20 70 67 6e 6f 29  eMove(pPg, pgno)
30f70 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
30f80 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b  eMakeDirty(pPg);
30f90 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  .  pPager->dbMod
30fa0 69 66 69 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66  ified = 1;..  if
30fb0 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29  ( needSyncPgno )
30fc0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64  {.    /* If need
30fd0 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d  SyncPgno is non-
30fe0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a  zero, then the j
30ff0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64  ournal file need
31000 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20  s to be .    ** 
31010 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20  sync()ed before 
31020 61 6e 79 20 64 61 74 61 20 69 73 20 77 72 69 74  any data is writ
31030 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20  ten to database 
31040 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79  file page needSy
31050 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43  ncPgno..    ** C
31060 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63  urrently, no suc
31070 68 20 70 61 67 65 20 65 78 69 73 74 73 20 69 6e  h page exists in
31080 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
31090 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  and the .    ** 
310a0 22 69 73 20 6a 6f 75 72 6e 61 6c 65 64 22 20 62  "is journaled" b
310b0 69 74 76 65 63 20 66 6c 61 67 20 68 61 73 20 62  itvec flag has b
310c0 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65  een set. This ne
310d0 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69  eds to be remedi
310e0 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 6c 6f 61  ed by.    ** loa
310f0 64 69 6e 67 20 74 68 65 20 70 61 67 65 20 69 6e  ding the page in
31100 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  to the pager-cac
31110 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74  he and setting t
31120 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
31130 63 20 0a 20 20 20 20 2a 2a 20 66 6c 61 67 2e 0a  c .    ** flag..
31140 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
31150 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
31160 6c 6f 61 64 20 74 68 65 20 70 61 67 65 20 69 6e  load the page in
31170 74 6f 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  to the page-cach
31180 65 20 66 61 69 6c 73 2c 20 28 64 75 65 0a 20 20  e fails, (due.  
31190 20 20 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63    ** to a malloc
311a0 28 29 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65  () or IO failure
311b0 29 2c 20 63 6c 65 61 72 20 74 68 65 20 62 69 74  ), clear the bit
311c0 20 69 6e 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e   in the pInJourn
311d0 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61  al[].    ** arra
311e0 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  y. Otherwise, if
311f0 20 74 68 65 20 70 61 67 65 20 69 73 20 6c 6f 61   the page is loa
31200 64 65 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20  ded and written 
31210 61 67 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20  again in.    ** 
31220 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
31230 2c 20 69 74 20 6d 61 79 20 62 65 20 77 72 69 74  , it may be writ
31240 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
31250 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a  ase file before.
31260 20 20 20 20 2a 2a 20 69 74 20 69 73 20 73 79 6e      ** it is syn
31270 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ced into the jou
31280 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
31290 77 61 79 2c 20 69 74 20 6d 61 79 20 65 6e 64 20  way, it may end 
312a0 75 70 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  up in.    ** the
312b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 77   journal file tw
312c0 69 63 65 2c 20 62 75 74 20 74 68 61 74 20 69 73  ice, but that is
312d0 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a   not a problem..
312e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
312f0 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  e sqlite3PagerGe
31300 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75  t() call may cau
31310 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  se the journal t
31320 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a  o sync. So make.
31330 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20      ** sure the 
31340 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66  Pager.needSync f
31350 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a  lag is set too..
31360 20 20 20 20 2a 2f 0a 20 20 20 20 50 67 48 64 72      */.    PgHdr
31370 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73   *pPgHdr;.    as
31380 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
31390 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63  edSync );.    rc
313a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
313b0 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53  et(pPager, needS
313c0 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72  yncPgno, &pPgHdr
313d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
313e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
313f0 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67    if( needSyncPg
31400 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  no<=pPager->dbOr
31410 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  igSize ){.      
31420 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
31430 2d 3e 70 54 6d 70 53 70 61 63 65 21 3d 30 20 29  ->pTmpSpace!=0 )
31440 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
31450 33 42 69 74 76 65 63 43 6c 65 61 72 28 70 50 61  3BitvecClear(pPa
31460 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
31470 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 70   needSyncPgno, p
31480 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
31490 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
314a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
314b0 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  }.    pPager->ne
314c0 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
314d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
314e0 6e 6f 53 79 6e 63 3d 3d 30 20 26 26 20 21 4d 45  noSync==0 && !ME
314f0 4d 44 42 20 29 3b 0a 20 20 20 20 70 50 67 48 64  MDB );.    pPgHd
31500 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  r->flags |= PGHD
31510 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20  R_NEED_SYNC;.   
31520 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
31530 6b 65 44 69 72 74 79 28 70 50 67 48 64 72 29 3b  keDirty(pPgHdr);
31540 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
31550 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a  rUnref(pPgHdr);.
31560 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46    }..  /*.  ** F
31570 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
31580 64 61 74 61 62 61 73 65 2c 20 6d 61 6b 65 20 73  database, make s
31590 75 72 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ure the original
315a0 20 70 61 67 65 20 63 6f 6e 74 69 6e 75 65 73 0a   page continues.
315b0 20 20 2a 2a 20 74 6f 20 65 78 69 73 74 2c 20 69    ** to exist, i
315c0 6e 20 63 61 73 65 20 74 68 65 20 74 72 61 6e 73  n case the trans
315d0 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  action needs to 
315e0 72 6f 6c 6c 20 62 61 63 6b 2e 20 20 57 65 20 61  roll back.  We a
315f0 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68 65  llocate.  ** the
31600 20 70 61 67 65 20 6e 6f 77 2c 20 69 6e 73 74 65   page now, inste
31610 61 64 20 6f 66 20 61 74 20 72 6f 6c 6c 62 61 63  ad of at rollbac
31620 6b 2c 20 62 65 63 61 75 73 65 20 77 65 20 63 61  k, because we ca
31630 6e 20 62 65 74 74 65 72 20 64 65 61 6c 0a 20 20  n better deal.  
31640 2a 2a 20 77 69 74 68 20 61 6e 20 6f 75 74 2d 6f  ** with an out-o
31650 66 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20 6e  f-memory error n
31660 6f 77 2e 20 20 54 69 63 6b 65 74 20 23 33 37 36  ow.  Ticket #376
31670 31 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45  1..  */.  if( ME
31680 4d 44 42 20 29 7b 0a 20 20 20 20 44 62 50 61 67  MDB ){.    DbPag
31690 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 72 63 20  e *pNew;.    rc 
316a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  = sqlite3PagerAc
316b0 71 75 69 72 65 28 70 50 61 67 65 72 2c 20 6f 72  quire(pPager, or
316c0 69 67 50 67 6e 6f 2c 20 26 70 4e 65 77 2c 20 31  igPgno, &pNew, 1
316d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
316e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
316f0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
31700 6f 76 65 28 70 50 67 2c 20 6f 72 69 67 50 67 6e  ove(pPg, origPgn
31710 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  o);.      return
31720 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   rc;.    }.    s
31730 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
31740 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72  (pNew);.  }..  r
31750 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
31760 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
31770 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
31780 72 20 74 6f 20 74 68 65 20 64 61 74 61 20 66 6f  r to the data fo
31790 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
317a0 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  page..*/.void *s
317b0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
317c0 74 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ta(DbPage *pPg){
317d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
317e0 6e 52 65 66 3e 30 20 7c 7c 20 70 50 67 2d 3e 70  nRef>0 || pPg->p
317f0 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 3b 0a  Pager->memDb );.
31800 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 44    return pPg->pD
31810 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ata;.}../*.** Re
31820 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
31830 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74  o the Pager.nExt
31840 72 61 20 62 79 74 65 73 20 6f 66 20 22 65 78 74  ra bytes of "ext
31850 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c  ra" space .** al
31860 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69  located along wi
31870 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64  th the specified
31880 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a   page..*/.void *
31890 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
318a0 78 74 72 61 28 44 62 50 61 67 65 20 2a 70 50 67  xtra(DbPage *pPg
318b0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  ){.  return pPg-
318c0 3e 70 45 78 74 72 61 3b 0a 7d 0a 0a 2f 2a 0a 2a  >pExtra;.}../*.*
318d0 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f  * Get/set the lo
318e0 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74  cking-mode for t
318f0 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d  his pager. Param
31900 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20  eter eMode must 
31910 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47  be one.** of PAG
31920 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51  ER_LOCKINGMODE_Q
31930 55 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b  UERY, PAGER_LOCK
31940 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f  INGMODE_NORMAL o
31950 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b  r .** PAGER_LOCK
31960 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
31970 45 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d 65  E. If the parame
31980 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52  ter is not _QUER
31990 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c  Y, then.** the l
319a0 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73  ocking-mode is s
319b0 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
319c0 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  specified..**.**
319d0 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
319e0 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 50 41  lue is either PA
319f0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
31a00 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47  NORMAL or.** PAG
31a10 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
31a20 58 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61  XCLUSIVE, indica
31a30 74 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ting the current
31a40 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74   (possibly updat
31a50 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d  ed).** locking-m
31a60 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ode..*/.int sqli
31a70 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d  te3PagerLockingM
31a80 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ode(Pager *pPage
31a90 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20  r, int eMode){. 
31aa0 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d   assert( eMode==
31ab0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
31ac0 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20 20  E_QUERY.        
31ad0 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
31ae0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
31af0 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20  NORMAL.         
31b00 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
31b10 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
31b20 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73  XCLUSIVE );.  as
31b30 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
31b40 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20  INGMODE_QUERY<0 
31b50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
31b60 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
31b70 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45  ORMAL>=0 && PAGE
31b80 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
31b90 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20  CLUSIVE>=0 );.  
31ba0 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20  if( eMode>=0 && 
31bb0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
31bc0 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  e ){.    pPager-
31bd0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
31be0 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a   (u8)eMode;.  }.
31bf0 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50    return (int)pP
31c00 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
31c10 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ode;.}../*.** Ge
31c20 74 2f 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61  t/set the journa
31c30 6c 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20  l-mode for this 
31c40 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72  pager. Parameter
31c50 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f   eMode must be o
31c60 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ne of:.**.**    
31c70 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
31c80 45 5f 51 55 45 52 59 0a 2a 2a 20 20 20 20 50 41  E_QUERY.**    PA
31c90 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
31ca0 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 50 41 47  DELETE.**    PAG
31cb0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
31cc0 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 50 41  RUNCATE.**    PA
31cd0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
31ce0 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 50 41  PERSIST.**    PA
31cf0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
31d00 4f 46 46 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f  OFF.**    PAGER_
31d10 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
31d20 52 59 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  RY.**.** If the 
31d30 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
31d40 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 20 74 68   _QUERY, then th
31d50 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 69  e journal_mode i
31d60 73 20 73 65 74 20 74 6f 20 74 68 65 0a 2a 2a 20  s set to the.** 
31d70 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 20  value specified 
31d80 69 66 20 74 68 65 20 63 68 61 6e 67 65 20 69 73  if the change is
31d90 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 65 20 63   allowed.  The c
31da0 68 61 6e 67 65 20 69 73 20 64 69 73 61 6c 6c 6f  hange is disallo
31db0 77 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 66  wed.** for the f
31dc0 6f 6c 6c 6f 77 69 6e 67 20 72 65 61 73 6f 6e 73  ollowing reasons
31dd0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20  :.**.**   *  An 
31de0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
31df0 73 65 20 63 61 6e 20 6f 6e 6c 79 20 68 61 76 65  se can only have
31e00 20 69 74 73 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   its journal_mod
31e10 65 20 73 65 74 20 74 6f 20 5f 4f 46 46 0a 2a 2a  e set to _OFF.**
31e20 20 20 20 20 20 20 6f 72 20 5f 4d 45 4d 4f 52 59        or _MEMORY
31e30 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 68 65  ..**.**   *  The
31e40 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 6d 61   journal mode ma
31e50 79 20 6e 6f 74 20 62 65 20 63 68 61 6e 67 65 64  y not be changed
31e60 20 77 68 69 6c 65 20 61 20 74 72 61 6e 73 61 63   while a transac
31e70 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
31e80 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
31e90 65 64 20 69 6e 64 69 63 61 74 65 20 74 68 65 20  ed indicate the 
31ea0 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c  current (possibl
31eb0 79 20 75 70 64 61 74 65 64 29 20 6a 6f 75 72 6e  y updated) journ
31ec0 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  al-mode..*/.int 
31ed0 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72  sqlite3PagerJour
31ee0 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a 70  nalMode(Pager *p
31ef0 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65  Pager, int eMode
31f00 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f  ){.  assert( eMo
31f10 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
31f20 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20  LMODE_QUERY.    
31f30 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
31f40 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
31f50 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20  ODE_DELETE.     
31f60 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
31f70 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
31f80 44 45 5f 54 52 55 4e 43 41 54 45 0a 20 20 20 20  DE_TRUNCATE.    
31f90 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
31fa0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
31fb0 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20  ODE_PERSIST.    
31fc0 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
31fd0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
31fe0 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
31ff0 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
32000 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
32010 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 61 73 73  _MEMORY );.  ass
32020 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e  ert( PAGER_JOURN
32030 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29  ALMODE_QUERY<0 )
32040 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30  ;.  if( eMode>=0
32050 0a 20 20 20 26 26 20 28 21 4d 45 4d 44 42 20 7c  .   && (!MEMDB |
32060 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
32070 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
32080 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y .             
32090 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
320a0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
320b0 29 0a 20 20 20 26 26 20 21 70 50 61 67 65 72 2d  ).   && !pPager-
320c0 3e 64 62 4d 6f 64 69 66 69 65 64 0a 20 20 20 26  >dbModified.   &
320d0 26 20 28 21 69 73 4f 70 65 6e 28 70 50 61 67 65  & (!isOpen(pPage
320e0 72 2d 3e 6a 66 64 29 20 7c 7c 20 30 3d 3d 70 50  r->jfd) || 0==pP
320f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
32100 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 69  ).  ){.    if( i
32110 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
32120 64 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  d) ){.      sqli
32130 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
32140 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 20  r->jfd);.    }. 
32150 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
32160 61 6c 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f  alMode = (u8)eMo
32170 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  de;.  }.  return
32180 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f   (int)pPager->jo
32190 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a  urnalMode;.}../*
321a0 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20  .** Get/set the 
321b0 73 69 7a 65 2d 6c 69 6d 69 74 20 75 73 65 64 20  size-limit used 
321c0 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a  for persistent j
321d0 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a  ournal files..**
321e0 0a 2a 2a 20 53 65 74 74 69 6e 67 20 74 68 65 20  .** Setting the 
321f0 73 69 7a 65 20 6c 69 6d 69 74 20 74 6f 20 2d 31  size limit to -1
32200 20 6d 65 61 6e 73 20 6e 6f 20 6c 69 6d 69 74 20   means no limit 
32210 69 73 20 65 6e 66 6f 72 63 65 64 2e 0a 2a 2a 20  is enforced..** 
32220 41 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 73 65  An attempt to se
32230 74 20 61 20 6c 69 6d 69 74 20 73 6d 61 6c 6c 65  t a limit smalle
32240 72 20 74 68 61 6e 20 2d 31 20 69 73 20 61 20 6e  r than -1 is a n
32250 6f 2d 6f 70 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c  o-op..*/.i64 sql
32260 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c  ite3PagerJournal
32270 53 69 7a 65 4c 69 6d 69 74 28 50 61 67 65 72 20  SizeLimit(Pager 
32280 2a 70 50 61 67 65 72 2c 20 69 36 34 20 69 4c 69  *pPager, i64 iLi
32290 6d 69 74 29 7b 0a 20 20 69 66 28 20 69 4c 69 6d  mit){.  if( iLim
322a0 69 74 3e 3d 2d 31 20 29 7b 0a 20 20 20 20 70 50  it>=-1 ){.    pP
322b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
322c0 65 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 3b  eLimit = iLimit;
322d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50  .  }.  return pP
322e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
322f0 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eLimit;.}../*.**
32300 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
32310 72 20 74 6f 20 74 68 65 20 70 50 61 67 65 72 2d  r to the pPager-
32320 3e 70 42 61 63 6b 75 70 20 76 61 72 69 61 62 6c  >pBackup variabl
32330 65 2e 20 54 68 65 20 62 61 63 6b 75 70 20 6d 6f  e. The backup mo
32340 64 75 6c 65 0a 2a 2a 20 69 6e 20 62 61 63 6b 75  dule.** in backu
32350 70 2e 63 20 6d 61 69 6e 74 61 69 6e 73 20 74 68  p.c maintains th
32360 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69  e content of thi
32370 73 20 76 61 72 69 61 62 6c 65 2e 20 54 68 69 73  s variable. This
32380 20 6d 6f 64 75 6c 65 0a 2a 2a 20 75 73 65 73 20   module.** uses 
32390 69 74 20 6f 70 61 71 75 65 6c 79 20 61 73 20 61  it opaquely as a
323a0 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71  n argument to sq
323b0 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61  lite3BackupResta
323c0 72 74 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c 69  rt() and.** sqli
323d0 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
323e0 29 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 71 6c 69 74  ) only..*/.sqlit
323f0 65 33 5f 62 61 63 6b 75 70 20 2a 2a 73 71 6c 69  e3_backup **sqli
32400 74 65 33 50 61 67 65 72 42 61 63 6b 75 70 50 74  te3PagerBackupPt
32410 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
32420 7b 0a 20 20 72 65 74 75 72 6e 20 26 70 50 61 67  {.  return &pPag
32430 65 72 2d 3e 70 42 61 63 6b 75 70 3b 0a 7d 0a 0a  er->pBackup;.}..
32440 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
32450 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a  _OMIT_DISKIO */.