/ Hex Artifact Content
Login

Artifact 283d4e9c64d4a4555a9a15cf870180b4fc102f7e:


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 30  : pager.c,v 1.60
0350: 38 20 32 30 30 39 2f 30 37 2f 31 33 20 31 35 3a  8 2009/07/13 15:
0360: 35 32 3a 33 38 20 64 72 68 20 45 78 70 20 24 0a  52:38 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72  t.h"../*.** Macr
03b0: 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68  os for troublesh
03c0: 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61 6c 6c  ooting.  Normall
03d0: 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a  y turned off.*/.
03e0: 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69 74 65  #if 0.int sqlite
03f0: 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b 20 20  3PagerTrace=1;  
0400: 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61 62 6c  /* True to enabl
0410: 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 64 65  e tracing */.#de
0420: 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65 62 75  fine sqlite3Debu
0430: 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66 0a 23  gPrintf printf.#
0440: 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43  define PAGERTRAC
0450: 45 28 58 29 20 20 20 20 20 69 66 28 20 73 71 6c  E(X)     if( sql
0460: 69 74 65 33 50 61 67 65 72 54 72 61 63 65 20 29  ite3PagerTrace )
0470: 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72  { sqlite3DebugPr
0480: 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73 65 0a  intf X; }.#else.
0490: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
04a0: 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  CE(X).#endif../*
04b0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
04c0: 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61 72 65  g two macros are
04d0: 20 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65   used within the
04e0: 20 50 41 47 45 52 54 52 41 43 45 28 29 20 6d 61   PAGERTRACE() ma
04f0: 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f  cros above.** to
0500: 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d   print out file-
0510: 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a  descriptors. .**
0520: 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20 74 61  .** PAGERID() ta
0530: 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  kes a pointer to
0540: 20 61 20 50 61 67 65 72 20 73 74 72 75 63 74 20   a Pager struct 
0550: 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74 2e  as its argument.
0560: 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74   The.** associat
0570: 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ed file-descript
0580: 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  or is returned. 
0590: 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29 20 74  FILEHANDLEID() t
05a0: 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65 33 5f  akes an sqlite3_
05b0: 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 20 61  file.** struct a
05c0: 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74 2e 0a  s its argument..
05d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
05e0: 49 44 28 70 29 20 28 28 69 6e 74 29 28 70 2d 3e  ID(p) ((int)(p->
05f0: 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46 49 4c  fd)).#define FIL
0600: 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28 28  EHANDLEID(fd) ((
0610: 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54  int)fd)../*.** T
0620: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73  he page cache as
0630: 20 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61   a whole is alwa
0640: 79 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  ys in one of the
0650: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74   following.** st
0660: 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41  ates:.**.**   PA
0670: 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20  GER_UNLOCK      
0680: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
0690: 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
06a0: 79 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a  y reading or .**
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06c0: 20 20 20 20 20 20 20 77 72 69 74 69 6e 67 20 74         writing t
06d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
06e0: 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a  .  There is no.*
06f0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0700: 20 20 20 20 20 20 20 20 64 61 74 61 20 68 65 6c          data hel
0710: 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68  d in memory.  Th
0720: 69 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  is is the initia
0730: 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
0740: 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65             state
0750: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0760: 53 48 41 52 45 44 20 20 20 20 20 20 20 20 54 68  SHARED        Th
0770: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0780: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0790: 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  base..**        
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
07b0: 72 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65  riting is not pe
07c0: 72 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20  rmitted.  There 
07d0: 63 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20  can be.**       
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73  multiple readers
0800: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73   accessing the s
0810: 61 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ame database.** 
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68        file at th
0840: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a  e same time..**.
0850: 2a 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52  **   PAGER_RESER
0860: 56 45 44 20 20 20 20 20 20 54 68 69 73 20 70 72  VED      This pr
0870: 6f 63 65 73 73 20 68 61 73 20 72 65 73 65 72 76  ocess has reserv
0880: 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
0890: 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20  for writing.**  
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 20 20 20 62 75 74 20 68 61 73 20 6e 6f 74       but has not
08c0: 20 79 65 74 20 6d 61 64 65 20 61 6e 79 20 63 68   yet made any ch
08d0: 61 6e 67 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65  anges.  Only one
08e0: 20 70 72 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20   process.**     
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 61 74 20 61 20 74 69 6d 65 20 63 61 6e 20    at a time can 
0910: 72 65 73 65 72 76 65 20 74 68 65 20 64 61 74 61  reserve the data
0920: 62 61 73 65 2e 20 20 54 68 65 20 6f 72 69 67 69  base.  The origi
0930: 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  nal.**          
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0950: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e  abase file has n
0960: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
0970: 20 73 6f 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20   so other.**    
0980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0990: 20 20 20 70 72 6f 63 65 73 73 65 73 20 6d 61 79     processes may
09a0: 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e   still be readin
09b0: 67 20 74 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a  g the on-disk.**
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09d0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
09e0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  file..**.**   PA
09f0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20  GER_EXCLUSIVE   
0a00: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
0a10: 20 69 73 20 77 72 69 74 69 6e 67 20 74 68 65 20   is writing the 
0a20: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20  database..**    
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a40: 20 20 20 41 63 63 65 73 73 20 69 73 20 65 78 63     Access is exc
0a50: 6c 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65  lusive.  No othe
0a60: 72 20 70 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a  r processes or.*
0a70: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0a80: 20 20 20 20 20 20 20 20 74 68 72 65 61 64 73 20          threads 
0a90: 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 6f  can be reading o
0aa0: 72 20 77 72 69 74 69 6e 67 20 77 68 69 6c 65 20  r writing while 
0ab0: 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  one.**          
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f               pro
0ad0: 63 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 2e  cess is writing.
0ae0: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53  .**.**   PAGER_S
0af0: 59 4e 43 45 44 20 20 20 20 20 20 20 20 54 68 65  YNCED        The
0b00: 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20   pager moves to 
0b10: 74 68 69 73 20 73 74 61 74 65 20 66 72 6f 6d 20  this state from 
0b20: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 0a  PAGER_EXCLUSIVE.
0b30: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0b40: 20 20 20 20 20 20 20 20 20 61 66 74 65 72 20 61           after a
0b50: 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 68  ll dirty pages h
0b60: 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
0b70: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
0ba0: 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  nd the file has 
0bb0: 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a  been synced to.*
0bc0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0bd0: 20 20 20 20 20 20 20 20 64 69 73 6b 2e 20 41 6c          disk. Al
0be0: 6c 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74  l that remains t
0bf0: 6f 20 64 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76  o do is to remov
0c00: 65 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  e or.**         
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
0c20: 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
0c30: 61 6c 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  al file and the 
0c40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c60: 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20 63 6f        will be co
0c70: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  mmitted..**.** T
0c80: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 63 6f  he page cache co
0c90: 6d 65 73 20 75 70 20 69 6e 20 50 41 47 45 52 5f  mes up in PAGER_
0ca0: 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72  UNLOCK.  The fir
0cb0: 73 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c  st time a.** sql
0cc0: 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 6f  ite3PagerGet() o
0cd0: 63 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65  ccurs, the state
0ce0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20   transitions to 
0cf0: 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a  PAGER_SHARED..**
0d00: 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73   After all pages
0d10: 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61   have been relea
0d20: 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  sed using sqlite
0d30: 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a  _page_unref(),.*
0d40: 2a 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e  * the state tran
0d50: 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20  sitions back to 
0d60: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54  PAGER_UNLOCK.  T
0d70: 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a  he first time.**
0d80: 20 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67   that sqlite3Pag
0d90: 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
0da0: 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65 20 74  led, the state t
0db0: 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a  ransitions to.**
0dc0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
0dd0: 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73 71 6c    (Note that sql
0de0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
0df0: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20   can only be.** 
0e00: 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74  called on an out
0e10: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 77 68  standing page wh
0e20: 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ich means that t
0e30: 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a  he pager must.**
0e40: 20 62 65 20 69 6e 20 50 41 47 45 52 5f 53 48 41   be in PAGER_SHA
0e50: 52 45 44 20 62 65 66 6f 72 65 20 69 74 20 74 72  RED before it tr
0e60: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47  ansitions to PAG
0e70: 45 52 5f 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a  ER_RESERVED.).**
0e80: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
0e90: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65  means that there
0ea0: 20 69 73 20 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c   is an open roll
0eb0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  back journal..**
0ec0: 20 54 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20   The transition 
0ed0: 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  to PAGER_EXCLUSI
0ee0: 56 45 20 6f 63 63 75 72 73 20 62 65 66 6f 72 65  VE occurs before
0ef0: 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20   any changes.** 
0f00: 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
0f10: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
0f20: 68 6f 75 67 68 20 77 72 69 74 65 73 20 74 6f 20  hough writes to 
0f30: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  the rollback.** 
0f40: 6a 6f 75 72 6e 61 6c 20 6f 63 63 75 72 73 20 77  journal occurs w
0f50: 69 74 68 20 6a 75 73 74 20 50 41 47 45 52 5f 52  ith just PAGER_R
0f60: 45 53 45 52 56 45 44 2e 20 20 41 66 74 65 72 20  ESERVED.  After 
0f70: 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  an sqlite3PagerR
0f80: 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20  ollback().** or 
0f90: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
0fa0: 69 74 50 68 61 73 65 54 77 6f 28 29 2c 20 74 68  itPhaseTwo(), th
0fb0: 65 20 73 74 61 74 65 20 63 61 6e 20 67 6f 20 62  e state can go b
0fc0: 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ack to PAGER_SHA
0fd0: 52 45 44 2c 0a 2a 2a 20 6f 72 20 69 74 20 63 61  RED,.** or it ca
0fe0: 6e 20 73 74 61 79 20 61 74 20 50 41 47 45 52 5f  n stay at PAGER_
0ff0: 45 58 43 4c 55 53 49 56 45 20 69 66 20 77 65 20  EXCLUSIVE if we 
1000: 61 72 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65  are in exclusive
1010: 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f   access mode..*/
1020: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 55  .#define PAGER_U
1030: 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23 64 65  NLOCK      0.#de
1040: 66 69 6e 65 20 50 41 47 45 52 5f 53 48 41 52 45  fine PAGER_SHARE
1050: 44 20 20 20 20 20 20 31 20 20 20 2f 2a 20 73 61  D      1   /* sa
1060: 6d 65 20 61 73 20 53 48 41 52 45 44 5f 4c 4f 43  me as SHARED_LOC
1070: 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  K */.#define PAG
1080: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 32  ER_RESERVED    2
1090: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 52 45     /* same as RE
10a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23  SERVED_LOCK */.#
10b0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 58 43  define PAGER_EXC
10c0: 4c 55 53 49 56 45 20 20 20 34 20 20 20 2f 2a 20  LUSIVE   4   /* 
10d0: 73 61 6d 65 20 61 73 20 45 58 43 4c 55 53 49 56  same as EXCLUSIV
10e0: 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e  E_LOCK */.#defin
10f0: 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20  e PAGER_SYNCED  
1100: 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d      5../*.** A m
1110: 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69 6e  acro used for in
1120: 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65 63  voking the codec
1130: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
1140: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1150: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64 65  E_HAS_CODEC.# de
1160: 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c  fine CODEC1(P,D,
1170: 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69 66 28  N,X,E) \.    if(
1180: 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20 50 2d   P->xCodec && P-
1190: 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65  >xCodec(P->pCode
11a0: 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b 20 45  c,D,N,X)==0 ){ E
11b0: 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  ; }.# define COD
11c0: 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29  EC2(P,D,N,X,E,O)
11d0: 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e 78 43   \.    if( P->xC
11e0: 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28 63 68  odec==0 ){ O=(ch
11f0: 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c 0a 20  ar*)D; }else \. 
1200: 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61 72 2a     if( (O=(char*
1210: 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70  )(P->xCodec(P->p
1220: 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29 3d 3d  Codec,D,N,X)))==
1230: 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73 65 0a  0 ){ E; }.#else.
1240: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28  # define CODEC1(
1250: 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f 2a 20  P,D,N,X,E)   /* 
1260: 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e  NO-OP */.# defin
1270: 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58  e CODEC2(P,D,N,X
1280: 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a 29 44  ,E,O) O=(char*)D
1290: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
12a0: 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77  he maximum allow
12b0: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20  ed sector size. 
12c0: 31 36 4d 42 2e 20 49 66 20 74 68 65 20 78 53 65  16MB. If the xSe
12d0: 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74 68 6f  ctorsize() metho
12e0: 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  d .** returns a 
12f0: 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74 68 61  value larger tha
1300: 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d 41 58  n this, then MAX
1310: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 73 20  _SECTOR_SIZE is 
1320: 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  used instead..**
1330: 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f 6e 63   This could conc
1340: 65 69 76 61 62 6c 79 20 63 61 75 73 65 20 63 6f  eivably cause co
1350: 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f 77 69  rruption followi
1360: 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  ng a power failu
1370: 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20 61 20  re on.** such a 
1380: 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69 73 20  system. This is 
1390: 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75 6e 64  currently an und
13a0: 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69 74 2e  ocumented limit.
13b0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f  .*/.#define MAX_
13c0: 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78 30 31  SECTOR_SIZE 0x01
13d0: 30 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  00000../*.** An 
13e0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
13f0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
1400: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
1410: 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76 65   for each active
1420: 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61 6e  .** savepoint an
1430: 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  d statement tran
1440: 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73  saction in the s
1450: 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68 20  ystem. All such 
1460: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61 72  structures.** ar
1470: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
1480: 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
1490: 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  [] array, which 
14a0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
14b0: 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69 6e  .** resized usin
14c0: 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  g sqlite3Realloc
14d0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  ()..**.** When a
14e0: 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63 72   savepoint is cr
14f0: 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65 72  eated, the Pager
1500: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
1510: 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a 2a  fset field is.**
1520: 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61 20   set to 0. If a 
1530: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
1540: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
1550: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
1560: 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61 76  while.** the sav
1570: 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
1580: 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73 65  , then iHdrOffse
1590: 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
15a0: 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a 20  byte offset .** 
15b0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
15c0: 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 6a  owing the last j
15d0: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 72  ournal record wr
15e0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d  itten into the m
15f0: 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 62  ain.** journal b
1600: 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e 61  efore the journa
1610: 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20 69  l-header. This i
1620: 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69 6e  s required durin
1630: 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 72  g savepoint.** r
1640: 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61 67  ollback (see pag
1650: 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
1660: 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65 64  int())..*/.typed
1670: 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72 53  ef struct PagerS
1680: 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53 61  avepoint PagerSa
1690: 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74 20  vepoint;.struct 
16a0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 7b  PagerSavepoint {
16b0: 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b 20  .  i64 iOffset; 
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d0: 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66 73  /* Starting offs
16e0: 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e  et in main journ
16f0: 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  al */.  i64 iHdr
1700: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
1710: 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f 76       /* See abov
1720: 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
1730: 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20  InSavepoint;    
1740: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70 61      /* Set of pa
1750: 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76 65  ges in this save
1760: 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  point */.  Pgno 
1770: 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20  nOrig;          
1780: 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
1790: 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  nal number of pa
17a0: 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a 20  ges in file */. 
17b0: 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20 20   Pgno iSubRec;  
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17d0: 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
17e0: 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a 6f  record in sub-jo
17f0: 75 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  urnal */.};../*.
1800: 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63  ** A open page c
1810: 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61  ache is an insta
1820: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
1830: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
1840: 2a 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a  **.** errCode.**
1850: 0a 2a 2a 20 20 20 50 61 67 65 72 2e 65 72 72 43  .**   Pager.errC
1860: 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20 74  ode may be set t
1870: 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  o SQLITE_IOERR, 
1880: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20  SQLITE_CORRUPT, 
1890: 6f 72 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49 54  or.**   or SQLIT
18a0: 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65  E_FULL. Once one
18b0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68   of the first th
18c0: 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72  ree errors occur
18d0: 73 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a  s, it persists.*
18e0: 2a 20 20 20 61 6e 64 20 69 73 20 72 65 74 75 72  *   and is retur
18f0: 6e 65 64 20 61 73 20 74 68 65 20 72 65 73 75 6c  ned as the resul
1900: 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72  t of every major
1910: 20 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e   pager API call.
1920: 20 20 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49 54    The.**   SQLIT
1930: 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f  E_FULL return co
1940: 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64  de is slightly d
1950: 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72  ifferent. It per
1960: 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c  sists only until
1970: 20 74 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20 73   the.**   next s
1980: 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61  uccessful rollba
1990: 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20  ck is performed 
19a0: 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  on the pager cac
19b0: 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20 53  he. Also,.**   S
19c0: 51 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20  QLITE_FULL does 
19d0: 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 73  not affect the s
19e0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
19f0: 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65   and sqlite3Page
1a00: 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20 41  rLookup().**   A
1a10: 50 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74  PIs, they may st
1a20: 69 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63 63  ill be used succ
1a30: 65 73 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20  essfully..**.** 
1a40: 64 62 53 69 7a 65 56 61 6c 69 64 2c 20 64 62 53  dbSizeValid, dbS
1a50: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 2c  ize, dbOrigSize,
1a60: 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a 2a   dbFileSize.**.*
1a70: 2a 20 20 20 4d 61 6e 61 67 69 6e 67 20 74 68 65  *   Managing the
1a80: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1a90: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61  abase file in pa
1aa0: 67 65 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20  ges is a little 
1ab0: 63 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 20  complicated..** 
1ac0: 20 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 50    The variable P
1ad0: 61 67 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e 74  ager.dbSize cont
1ae0: 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ains the number 
1af0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68  of pages that th
1b00: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
1b10: 69 6d 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20  image currently 
1b20: 63 6f 6e 74 61 69 6e 73 2e 20 41 73 20 74 68 65  contains. As the
1b30: 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
1b40: 67 72 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b 73  grows or shrinks
1b50: 20 74 68 69 73 0a 2a 2a 20 20 20 76 61 72 69 61   this.**   varia
1b60: 62 6c 65 20 69 73 20 75 70 64 61 74 65 64 2e 20  ble is updated. 
1b70: 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61 67  The variable Pag
1b80: 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 63 6f  er.dbFileSize co
1b90: 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65  ntains the numbe
1ba0: 72 0a 2a 2a 20 20 20 6f 66 20 70 61 67 65 73 20  r.**   of pages 
1bb0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1bc0: 66 69 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 62  file. This may b
1bd0: 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
1be0: 20 50 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a 2a   Pager.dbSize.**
1bf0: 20 20 20 69 66 20 73 6f 6d 65 20 70 61 67 65 73     if some pages
1c00: 20 68 61 76 65 20 62 65 65 6e 20 61 70 70 65 6e   have been appen
1c10: 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62  ded to the datab
1c20: 61 73 65 20 69 6d 61 67 65 20 62 75 74 20 6e 6f  ase image but no
1c30: 74 20 79 65 74 20 77 72 69 74 74 65 6e 0a 2a 2a  t yet written.**
1c40: 20 20 20 6f 75 74 20 66 72 6f 6d 20 74 68 65 20     out from the 
1c50: 63 61 63 68 65 20 74 6f 20 74 68 65 20 61 63 74  cache to the act
1c60: 75 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ual file on disk
1c70: 2e 20 4f 72 20 69 66 20 74 68 65 20 69 6d 61 67  . Or if the imag
1c80: 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20  e has been.**   
1c90: 74 72 75 6e 63 61 74 65 64 20 62 79 20 61 6e 20  truncated by an 
1ca0: 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
1cb0: 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68  um operation. Th
1cc0: 65 20 50 61 67 65 72 2e 64 62 4f 72 69 67 53 69  e Pager.dbOrigSi
1cd0: 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20  ze variable.**  
1ce0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75   contains the nu
1cf0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1d00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
1d10: 61 67 65 20 77 68 65 6e 20 74 68 65 20 63 75 72  age when the cur
1d20: 72 65 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73 61  rent.**   transa
1d30: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
1d40: 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  . The contents o
1d50: 66 20 61 6c 6c 20 74 68 72 65 65 20 6f 66 20 74  f all three of t
1d60: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 69  hese variables i
1d70: 73 0a 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61 72  s.**   only guar
1d80: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 63 6f 72  anteed to be cor
1d90: 72 65 63 74 20 69 66 20 74 68 65 20 62 6f 6f 6c  rect if the bool
1da0: 65 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  ean Pager.dbSize
1db0: 56 61 6c 69 64 20 69 73 20 74 72 75 65 2e 0a 2a  Valid is true..*
1dc0: 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e 64  *.**   TODO: Und
1dd0: 65 72 20 77 68 61 74 20 63 6f 6e 64 69 74 69 6f  er what conditio
1de0: 6e 73 20 69 73 20 64 62 53 69 7a 65 56 61 6c 69  ns is dbSizeVali
1df0: 64 20 73 65 74 3f 20 43 6c 65 61 72 65 64 3f 0a  d set? Cleared?.
1e00: 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e  **.** changeCoun
1e10: 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  tDone.**.**   Th
1e20: 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  is boolean varia
1e30: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ble is used to m
1e40: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
1e50: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1e60: 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79   .**   (the 4-by
1e70: 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  te header field 
1e80: 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32  at byte offset 2
1e90: 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  4 of the databas
1ea0: 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20  e file) is .**  
1eb0: 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72   not updated mor
1ec0: 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63  e often than nec
1ed0: 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20  essary. .**.**  
1ee0: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72   It is set to tr
1ef0: 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e  ue when the chan
1f00: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
1f10: 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69   is updated, whi
1f20: 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c  ch .**   can onl
1f30: 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65  y happen if an e
1f40: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
1f50: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1f60: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
1f70: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28   It is cleared (
1f80: 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68  set to false) wh
1f90: 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73  enever an exclus
1fa0: 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  ive lock is .** 
1fb0: 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f    relinquished o
1fc0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1fd0: 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61  ile. Each time a
1fe0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1ff0: 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20  committed,.**   
2000: 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  The changeCountD
2010: 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70  one flag is insp
2020: 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20  ected. If it is 
2030: 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f  true, the work o
2040: 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20  f.**   updating 
2050: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
2060: 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f  er is omitted fo
2070: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  r the current tr
2080: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
2090: 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73     This mechanis
20a0: 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65  m means that whe
20b0: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  n running in exc
20c0: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63  lusive mode, a c
20d0: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  onnection .**   
20e0: 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65  need only update
20f0: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
2100: 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68  ter once, for th
2110: 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74  e first transact
2120: 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74  ion.**   committ
2130: 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64 69  ed..**.** dbModi
2140: 66 69 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  fied.**.**   The
2150: 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67   dbModified flag
2160: 20 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72   is set whenever
2170: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
2180: 20 69 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a 20   is dirtied..** 
2190: 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20    It is cleared 
21a0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61  at the end of ea
21b0: 63 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ch transaction..
21c0: 2a 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 75 73  **.**   It is us
21d0: 65 64 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69  ed when committi
21e0: 6e 67 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20  ng or otherwise 
21f0: 65 6e 64 69 6e 67 20 61 20 74 72 61 6e 73 61 63  ending a transac
2200: 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74 68  tion. If.**   th
2210: 65 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61  e dbModified fla
2220: 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20  g is clear then 
2230: 6c 65 73 73 20 77 6f 72 6b 20 68 61 73 20 74 6f  less work has to
2240: 20 62 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   be done..**.** 
2250: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 0a 2a  journalStarted.*
2260: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 66 6c 61 67  *.**   This flag
2270: 20 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72   is set whenever
2280: 20 74 68 65 20 74 68 65 20 6d 61 69 6e 20 6a 6f   the the main jo
2290: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2e  urnal is synced.
22a0: 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 70 6f   .**.**   The po
22b0: 69 6e 74 20 6f 66 20 74 68 69 73 20 66 6c 61 67  int of this flag
22c0: 20 69 73 20 74 68 61 74 20 69 74 20 6d 75 73 74   is that it must
22d0: 20 62 65 20 73 65 74 20 61 66 74 65 72 20 74 68   be set after th
22e0: 65 20 0a 2a 2a 20 20 20 66 69 72 73 74 20 6a 6f  e .**   first jo
22f0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20  urnal header in 
2300: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  a journal file h
2310: 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74  as been synced t
2320: 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41 66 74  o disk..**   Aft
2330: 65 72 20 74 68 69 73 20 68 61 73 20 68 61 70 70  er this has happ
2340: 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65 73 20  ened, new pages 
2350: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
2360: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 64  database .**   d
2370: 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20 50  o not need the P
2380: 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
2390: 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68 65 79  lag set, as they
23a0: 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a 20   do not need.** 
23b0: 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61 20    to wait for a 
23c0: 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62 65 66  journal sync bef
23d0: 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62 65 20  ore they can be 
23e0: 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 2a  written out to.*
23f0: 2a 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65  *   the database
2400: 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e 63 74   file (see funct
2410: 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74 65 28  ion pager_write(
2420: 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73 65 74  ))..**   .** set
2430: 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 54  Master.**.**   T
2440: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
2450: 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  used to ensure t
2460: 68 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a  hat the master j
2470: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
2480: 0a 2a 2a 20 20 20 28 69 66 20 61 6e 79 29 20 69  .**   (if any) i
2490: 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e 20 69  s only written i
24a0: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
24b0: 66 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a 2a 2a  file once..**.**
24c0: 20 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74 74 69     When committi
24d0: 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
24e0: 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  , the master jou
24f0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 28  rnal file name (
2500: 69 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d 61 79  if any).**   may
2510: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
2520: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2530: 65 20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65  e while the page
2540: 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a 2a 2a  r is still in.**
2550: 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56 45     PAGER_RESERVE
2560: 44 20 73 74 61 74 65 20 28 73 65 65 20 43 6f 6d  D state (see Com
2570: 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 66 6f  mitPhaseOne() fo
2580: 72 20 74 68 65 20 61 63 74 69 6f 6e 29 2e 20 49  r the action). I
2590: 74 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74 74 65  t.**   then atte
25a0: 6d 70 74 73 20 74 6f 20 75 70 67 72 61 64 65 20  mpts to upgrade 
25b0: 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  to an exclusive 
25c0: 6c 6f 63 6b 2e 20 49 66 20 74 68 69 73 20 61 74  lock. If this at
25d0: 74 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69 6c 73  tempt.**   fails
25e0: 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 42 55  , then SQLITE_BU
25f0: 53 59 20 6d 61 79 20 62 65 20 72 65 74 75 72 6e  SY may be return
2600: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20 61  ed to the user a
2610: 6e 64 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 20  nd the user.**  
2620: 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f 20   may attempt to 
2630: 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
2640: 61 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61 74  action again lat
2650: 65 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a 20 20  er (calling.**  
2660: 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28   CommitPhaseOne(
2670: 29 20 61 67 61 69 6e 29 2e 20 54 68 69 73 20 66  ) again). This f
2680: 6c 61 67 20 69 73 20 75 73 65 64 20 74 6f 20 65  lag is used to e
2690: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 0a  nsure that the .
26a0: 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72  **   master jour
26b0: 6e 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e 6c 79  nal name is only
26c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
26d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
26e0: 20 66 69 72 73 74 0a 2a 2a 20 20 20 74 69 6d 65   first.**   time
26f0: 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28   CommitPhaseOne(
2700: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  ) is called..**.
2710: 2a 2a 20 64 6f 4e 6f 74 53 79 6e 63 0a 2a 2a 0a  ** doNotSync.**.
2720: 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61 62  **   This variab
2730: 6c 65 20 69 73 20 73 65 74 20 61 6e 64 20 63 6c  le is set and cl
2740: 65 61 72 65 64 20 62 79 20 73 71 6c 69 74 65 33  eared by sqlite3
2750: 50 61 67 65 72 57 72 69 74 65 28 29 2e 0a 2a 2a  PagerWrite()..**
2760: 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a 0a  .** needSync.**.
2770: 2a 2a 20 20 20 54 4f 44 4f 3a 20 49 74 20 6d 69  **   TODO: It mi
2780: 67 68 74 20 62 65 20 65 61 73 69 65 72 20 74 6f  ght be easier to
2790: 20 73 65 74 20 74 68 69 73 20 76 61 72 69 61 62   set this variab
27a0: 6c 65 20 69 6e 20 77 72 69 74 65 4a 6f 75 72 6e  le in writeJourn
27b0: 61 6c 48 64 72 28 29 0a 2a 2a 20 20 20 61 6e 64  alHdr().**   and
27c0: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
27d0: 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20 43 68 61 6e  nal() only. Chan
27e0: 67 65 20 69 74 73 20 6d 65 61 6e 69 6e 67 20 74  ge its meaning t
27f0: 6f 20 22 75 6e 73 79 6e 63 65 64 20 64 61 74 61  o "unsynced data
2800: 0a 2a 2a 20 20 20 68 61 73 20 62 65 65 6e 20 77  .**   has been w
2810: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
2820: 75 72 6e 61 6c 22 2e 0a 2a 2a 0a 2a 2a 20 73 75  urnal"..**.** su
2830: 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a  bjInMemory.**.**
2840: 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f 6f     This is a boo
2850: 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20 49  lean variable. I
2860: 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79  f true, then any
2870: 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a 6f   required sub-jo
2880: 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f 70  urnal.**   is op
2890: 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65  ened as an in-me
28a0: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  mory journal fil
28b0: 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68 65  e. If false, the
28c0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20  n in-memory.**  
28d0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61 72   sub-journals ar
28e0: 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20  e only used for 
28f0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20  in-memory pager 
2900: 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  files..*/.struct
2910: 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74   Pager {.  sqlit
2920: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
2930: 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e         /* OS fun
2940: 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f  ctions to use fo
2950: 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63  r IO */.  u8 exc
2960: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
2970: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
2980: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
2990: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
29a0: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
29b0: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
29c0: 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68 65 20     /* On of the 
29d0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
29e0: 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  E_* values */.  
29f0: 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20  u8 useJournal;  
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
2a10: 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  se a rollback jo
2a20: 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69  urnal on this fi
2a30: 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61  le */.  u8 noRea
2a40: 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  dlock;          
2a50: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f      /* Do not bo
2a60: 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72  ther to obtain r
2a70: 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38  eadlocks */.  u8
2a80: 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20   noSync;        
2a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
2aa0: 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  not sync the jou
2ab0: 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a  rnal if true */.
2ac0: 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20    u8 fullSync;  
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ae0: 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20   Do extra syncs 
2af0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
2b00: 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f  or robustness */
2b10: 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c 61 67 73  .  u8 sync_flags
2b20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2b30: 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e 4f  * One of SYNC_NO
2b40: 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c  RMAL or SYNC_FUL
2b50: 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69  L */.  u8 tempFi
2b60: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
2b70: 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
2b80: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
2b90: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64  ile */.  u8 read
2ba0: 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20  Only;           
2bb0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
2bc0: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
2bd0: 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d 65  abase */.  u8 me
2be0: 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  mDb;            
2bf0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
2c00: 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69  o inhibit all fi
2c10: 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a 20  le I/O */..  /* 
2c20: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
2c30: 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f  ock contains tho
2c40: 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73  se class members
2c50: 20 74 68 61 74 20 61 72 65 20 64 79 6e 61 6d 69   that are dynami
2c60: 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d 6f 64 69 66  cally.  ** modif
2c70: 69 65 64 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61  ied during norma
2c80: 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 54 68  l operations. Th
2c90: 65 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c 65  e other variable
2ca0: 73 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  s in this struct
2cb0: 75 72 65 0a 20 20 2a 2a 20 61 72 65 20 65 69 74  ure.  ** are eit
2cc0: 68 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 72  her constant thr
2cd0: 6f 75 67 68 6f 75 74 20 74 68 65 20 6c 69 66 65  oughout the life
2ce0: 74 69 6d 65 20 6f 66 20 74 68 65 20 70 61 67 65  time of the page
2cf0: 72 2c 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20  r, or else.  ** 
2d00: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 63 6f  used to store co
2d10: 6e 66 69 67 75 72 61 74 69 6f 6e 20 70 61 72 61  nfiguration para
2d20: 6d 65 74 65 72 73 20 74 68 61 74 20 61 66 66 65  meters that affe
2d30: 63 74 20 74 68 65 20 77 61 79 20 74 68 65 20 70  ct the way the p
2d40: 61 67 65 72 20 0a 20 20 2a 2a 20 6f 70 65 72 61  ager .  ** opera
2d50: 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  tes..  **.  ** T
2d60: 68 65 20 27 73 74 61 74 65 27 20 76 61 72 69 61  he 'state' varia
2d70: 62 6c 65 20 69 73 20 64 65 73 63 72 69 62 65 64  ble is described
2d80: 20 69 6e 20 6d 6f 72 65 20 64 65 74 61 69 6c 20   in more detail 
2d90: 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 0a 20  along with the. 
2da0: 20 2a 2a 20 64 65 73 63 72 69 70 74 69 6f 6e 73   ** descriptions
2db0: 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20 69   of the values i
2dc0: 74 20 6d 61 79 20 74 61 6b 65 20 2d 20 50 41 47  t may take - PAG
2dd0: 45 52 5f 55 4e 4c 4f 43 4b 20 65 74 63 2e 20 4d  ER_UNLOCK etc. M
2de0: 61 6e 79 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  any of the.  ** 
2df0: 6f 74 68 65 72 20 76 61 72 69 61 62 6c 65 73 20  other variables 
2e00: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
2e10: 65 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74  e described in t
2e20: 68 65 20 63 6f 6d 6d 65 6e 74 20 64 69 72 65 63  he comment direc
2e30: 74 6c 79 20 0a 20 20 2a 2a 20 61 62 6f 76 65 20  tly .  ** above 
2e40: 74 68 69 73 20 63 6c 61 73 73 20 64 65 66 69 6e  this class defin
2e50: 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 75 38  ition..  */.  u8
2e60: 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20   state;         
2e70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
2e80: 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52  ER_UNLOCK, _SHAR
2e90: 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20 65  ED, _RESERVED, e
2ea0: 74 63 2e 20 2a 2f 0a 20 20 75 38 20 64 62 4d 6f  tc. */.  u8 dbMo
2eb0: 64 69 66 69 65 64 3b 20 20 20 20 20 20 20 20 20  dified;         
2ec0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2ed0: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 63 68  there are any ch
2ee0: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 44 62 20  anges to the Db 
2ef0: 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63  */.  u8 needSync
2f00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f10: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66   /* True if an f
2f20: 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64  sync() is needed
2f30: 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
2f40: 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53  */.  u8 journalS
2f50: 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20 20  tarted;         
2f60: 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61 64   /* True if head
2f70: 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73  er of journal is
2f80: 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20   synced */.  u8 
2f90: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b  changeCountDone;
2fa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
2fb0: 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69  after incrementi
2fc0: 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  ng the change-co
2fd0: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65  unter */.  u8 se
2fe0: 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20  tMaster;        
2ff0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3000: 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73  f a m-j name has
3010: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
3020: 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f   jrnl */.  u8 do
3030: 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20 20  NotSync;        
3040: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
3050: 6e 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20 64  n. While true, d
3060: 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20  o not spill the 
3070: 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 64 62  cache */.  u8 db
3080: 53 69 7a 65 56 61 6c 69 64 3b 20 20 20 20 20 20  SizeValid;      
3090: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 77 68         /* Set wh
30a0: 65 6e 20 64 62 53 69 7a 65 20 69 73 20 63 6f 72  en dbSize is cor
30b0: 72 65 63 74 20 2a 2f 0a 20 20 75 38 20 73 75 62  rect */.  u8 sub
30c0: 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20 20  jInMemory;      
30d0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
30e0: 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   use in-memory s
30f0: 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20  ub-journals */. 
3100: 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20 20   Pgno dbSize;   
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3120: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
3130: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
3140: 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69 67  */.  Pgno dbOrig
3150: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
3160: 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72   /* dbSize befor
3170: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  e the current tr
3180: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 50  ansaction */.  P
3190: 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b 20  gno dbFileSize; 
31a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
31b0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
31c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31d0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43  le */.  int errC
31e0: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
31f0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65      /* One of se
3200: 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65  veral kinds of e
3210: 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  rrors */.  int n
3220: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
3230: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20         /* Pages 
3240: 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63 65  journalled since
3250: 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20 77   last j-header w
3260: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32 20  ritten */.  u32 
3270: 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20  cksumInit;      
3280: 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69          /* Quasi
3290: 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64  -random value ad
32a0: 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65  ded to every che
32b0: 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20 6e  cksum */.  u32 n
32c0: 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20 20  SubRec;         
32d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
32e0: 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69 74   of records writ
32f0: 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72 6e  ten to sub-journ
3300: 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  al */.  Bitvec *
3310: 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  pInJournal;     
3320: 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66      /* One bit f
3330: 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
3340: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
3350: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
3360: 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20 20  ile *fd;        
3370: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
3380: 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62 61  iptor for databa
3390: 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  se */.  sqlite3_
33a0: 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20  file *jfd;      
33b0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
33c0: 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e 20  riptor for main 
33d0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c  journal */.  sql
33e0: 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64 3b  ite3_file *sjfd;
33f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
3400: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
3410: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  sub-journal */. 
3420: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b   i64 journalOff;
3430: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3440: 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f 66  Current write of
3450: 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  fset in the jour
3460: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
3470: 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20  4 journalHdr;   
3480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
3490: 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76  e offset to prev
34a0: 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61  ious journal hea
34b0: 64 65 72 20 2a 2f 0a 20 20 50 61 67 65 72 53 61  der */.  PagerSa
34c0: 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70 6f  vepoint *aSavepo
34d0: 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f 66  int; /* Array of
34e0: 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
34f0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 76  ts */.  int nSav
3500: 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 20  epoint;         
3510: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3520: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53 61   elements in aSa
3530: 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20 63  vepoint[] */.  c
3540: 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31  har dbFileVers[1
3550: 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68  6];        /* Ch
3560: 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64  anges whenever d
3570: 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
3580: 6e 67 65 73 20 2a 2f 0a 20 20 75 33 32 20 73 65  nges */.  u32 se
3590: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
35a0: 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64        /* Assumed
35b0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72   sector size dur
35c0: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ing rollback */.
35d0: 0a 20 20 75 31 36 20 6e 45 78 74 72 61 3b 20 20  .  u16 nExtra;  
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35f0: 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20  * Add this many 
3600: 62 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e  bytes to each in
3610: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
3620: 20 20 69 31 36 20 6e 52 65 73 65 72 76 65 3b 20    i16 nReserve; 
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3640: 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65   Number of unuse
3650: 64 20 62 79 74 65 73 20 61 74 20 65 6e 64 20 6f  d bytes at end o
3660: 66 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  f each page */. 
3670: 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b 20 20   u32 vfsFlags;  
3680: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3690: 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65  Flags for sqlite
36a0: 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
36b0: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
36c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
36e0: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
36f0: 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20   Pgno mxPgno;   
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3710: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
3720: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
3730: 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  base */.  char *
3740: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
3750: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
3760: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3770: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
3780: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
3790: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
37a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
37b0: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  */.  int (*xBusy
37c0: 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b  Handler)(void*);
37d0: 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
37e0: 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a  call when busy *
37f0: 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
3800: 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20  andlerArg;      
3810: 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d  /* Context argum
3820: 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e  ent for xBusyHan
3830: 64 6c 65 72 20 2a 2f 0a 23 69 66 64 65 66 20 53  dler */.#ifdef S
3840: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
3850: 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20 20   nHit, nMiss;   
3860: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68           /* Cach
3870: 65 20 68 69 74 73 20 61 6e 64 20 6d 69 73 73 69  e hits and missi
3880: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61  ng */.  int nRea
3890: 64 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20  d, nWrite;      
38a0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
38b0: 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74 74  pages read/writt
38c0: 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76  en */.#endif.  v
38d0: 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29  oid (*xReiniter)
38e0: 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61  (DbPage*); /* Ca
38f0: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
3900: 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70  when reloading p
3910: 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53  ages */.#ifdef S
3920: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
3930: 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63    void *(*xCodec
3940: 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67  )(void*,void*,Pg
3950: 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74  no,int); /* Rout
3960: 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64  ine for en/decod
3970: 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  ing data */.  vo
3980: 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43  id (*xCodecSizeC
3990: 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69  hng)(void*,int,i
39a0: 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f  nt); /* Notify o
39b0: 66 20 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e  f page size chan
39c0: 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ges */.  void (*
39d0: 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64  xCodecFree)(void
39e0: 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *);             
39f0: 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f  /* Destructor fo
3a00: 72 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20  r the codec */. 
3a10: 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20   void *pCodec;  
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3a30: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
3a40: 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68  o xCodec... meth
3a50: 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ods */.#endif.  
3a60: 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b  char *pTmpSpace;
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3a80: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79  ager.pageSize by
3a90: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
3aa0: 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 69 36   tmp use */.  i6
3ab0: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  4 journalSizeLim
3ac0: 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  it;       /* Siz
3ad0: 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73  e limit for pers
3ae0: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  istent journal f
3af0: 69 6c 65 73 20 2a 2f 0a 20 20 50 43 61 63 68 65  iles */.  PCache
3b00: 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20   *pPCache;      
3b10: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
3b20: 20 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f   to page cache o
3b30: 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
3b40: 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b  e3_backup *pBack
3b50: 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  up;    /* Pointe
3b60: 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67  r to list of ong
3b70: 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63  oing backup proc
3b80: 65 73 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  esses */.};../*.
3b90: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
3ba0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
3bb0: 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20  s hold counters 
3bc0: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
3bd0: 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c  ing purposes onl
3be0: 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  y.  These variab
3bf0: 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  les do not exist
3c00: 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73   in.** a non-tes
3c10: 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65  ting build.  The
3c20: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
3c30: 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65   not thread-safe
3c40: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
3c50: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
3c60: 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
3c70: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
3c80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
3c90: 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d   pages read from
3ca0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
3cb0: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
3cc0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a  _count = 0;   /*
3cd0: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
3ce0: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
3cf0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
3d00: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
3d10: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
3d20: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
3d30: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
3d40: 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  nal */.# define 
3d50: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76  PAGER_INCR(v)  v
3d60: 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ++.#else.# defin
3d70: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a  e PAGER_INCR(v).
3d80: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
3d90: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
3da0: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
3db0: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
3dc0: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
3dd0: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
3de0: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
3df0: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
3e00: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
3e10: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
3e20: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
3e30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
3e40: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
3e50: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
3e60: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
3e70: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
3e80: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
3e90: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
3ea0: 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e  being.** written
3eb0: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
3ec0: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
3ed0: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
3ee0: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
3ef0: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
3f00: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
3f10: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
3f20: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
3f30: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
3f40: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
3f50: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
3f60: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
3f70: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
3f80: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
3f90: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
3fa0: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
3fb0: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
3fc0: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
3fd0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
3fe0: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
3ff0: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
4000: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
4010: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
4020: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
4030: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
4040: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
4050: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
4060: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
4070: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
4080: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
4090: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
40a0: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
40b0: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
40c0: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
40d0: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
40e0: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
40f0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
4100: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
4110: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
4120: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
4130: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
4140: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
4150: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
4160: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
4170: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
4180: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
4190: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
41a0: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
41b0: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
41c0: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
41d0: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
41e0: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
41f0: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
4200: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
4210: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
4220: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
4230: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
4240: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
4250: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
4260: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
4270: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
4280: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
4290: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
42a0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
42b0: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
42c0: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
42d0: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
42e0: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
42f0: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
4300: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
4310: 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63  ze of the of eac
4320: 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e  h page record in
4330: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
4340: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20  given by.** the 
4350: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e  following macro.
4360: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
4370: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
4380: 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67  )  ((pPager->pag
4390: 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a  eSize) + 8)../*.
43a0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** The journal h
43b0: 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74  eader size for t
43c0: 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20  his pager. This 
43d0: 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73  is usually the s
43e0: 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20  ame .** size as 
43f0: 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
4400: 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73  ctor. See also s
4410: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a  etSectorSize()..
4420: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
4430: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
4440: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
4450: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
4460: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
4470: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
4480: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
4490: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
44a0: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
44b0: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
44c0: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
44d0: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
44e0: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
44f0: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
4500: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
4510: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
4520: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
4530: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
4540: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
4550: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
4560: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
4570: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
4580: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
4590: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
45a0: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
45b0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
45c0: 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20  e maximum legal 
45d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28  page number is (
45e0: 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64  2^31 - 1)..*/.#d
45f0: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f  efine PAGER_MAX_
4600: 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a  PGNO 2147483647.
4610: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
4620: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a  ./*.** Usage:.**
4630: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73  .**   assert( as
4640: 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
4650: 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2f 0a 73  (pPager) );.*/.s
4660: 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74  tatic int assert
4670: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67  _pager_state(Pag
4680: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20  er *pPager){..  
4690: 2f 2a 20 41 20 74 65 6d 70 2d 66 69 6c 65 20 69  /* A temp-file i
46a0: 73 20 61 6c 77 61 79 73 20 69 6e 20 50 41 47 45  s always in PAGE
46b0: 52 5f 45 58 43 4c 55 53 49 56 45 20 6f 72 20 50  R_EXCLUSIVE or P
46c0: 41 47 45 52 5f 53 59 4e 43 45 44 20 73 74 61 74  AGER_SYNCED stat
46d0: 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
46e0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
46f0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ==0 || pPager->s
4700: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
4710: 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 54  USIVE );..  /* T
4720: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
4730: 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79  ne flag is alway
4740: 73 20 73 65 74 20 66 6f 72 20 74 65 6d 70 2d 66  s set for temp-f
4750: 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  iles */.  assert
4760: 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
4770: 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  le==0 || pPager-
4780: 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
4790: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b   );..  return 1;
47a0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
47b0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
47c0: 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
47d0: 74 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70  to write page *p
47e0: 50 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  Pg into the sub-
47f0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61  journal..** A pa
4800: 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77  ge needs to be w
4810: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
4820: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74  sub-journal if t
4830: 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a  here exists one.
4840: 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20  ** or more open 
4850: 73 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77  savepoints for w
4860: 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  hich:.**.**   * 
4870: 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  The page-number 
4880: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
4890: 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61  equal to PagerSa
48a0: 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61  vepoint.nOrig, a
48b0: 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69  nd.**   * The bi
48c0: 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
48d0: 74 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  to the page-numb
48e0: 65 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e  er is not set in
48f0: 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
4900: 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
4910: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
4920: 6e 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  nt subjRequiresP
4930: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
4940: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
4950: 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  Pg->pgno;.  Page
4960: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
4970: 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69  >pPager;.  int i
4980: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
4990: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
49a0: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67  t; i++){.    Pag
49b0: 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d  erSavepoint *p =
49c0: 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
49d0: 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28  oint[i];.    if(
49e0: 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20   p->nOrig>=pgno 
49f0: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74  && 0==sqlite3Bit
4a00: 76 65 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61  vecTest(p->pInSa
4a10: 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29  vepoint, pgno) )
4a20: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
4a30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
4a40: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
4a50: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
4a60: 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65  the page is alre
4a70: 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
4a80: 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  al file..*/.stat
4a90: 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75  ic int pageInJou
4aa0: 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29  rnal(PgHdr *pPg)
4ab0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
4ac0: 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 67  e3BitvecTest(pPg
4ad0: 2d 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ->pPager->pInJou
4ae0: 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
4af0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
4b00: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
4b10: 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20   from the given 
4b20: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
4b30: 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65    Store the inte
4b40: 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72  ger.** that is r
4b50: 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52  ead in *pRes.  R
4b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
4b70: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
4b80: 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65  rked, or an.** e
4b90: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
4ba0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
4bb0: 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c  g..**.** All val
4bc0: 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f  ues are stored o
4bd0: 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e  n disk as big-en
4be0: 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dian..*/.static 
4bf0: 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73  int read32bits(s
4c00: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
4c10: 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32   i64 offset, u32
4c20: 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67   *pRes){.  unsig
4c30: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
4c40: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
4c50: 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c  e3OsRead(fd, ac,
4c60: 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66   sizeof(ac), off
4c70: 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  set);.  if( rc==
4c80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4c90: 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33   *pRes = sqlite3
4ca0: 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20  Get4byte(ac);.  
4cb0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4cc0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
4cd0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
4ce0: 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66  nto a string buf
4cf0: 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  fer in big-endia
4d00: 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f  n byte order..*/
4d10: 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69  .#define put32bi
4d20: 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33  ts(A,B)  sqlite3
4d30: 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c  Put4byte((u8*)A,
4d40: 42 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  B)../*.** Write 
4d50: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
4d60: 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20   into the given 
4d70: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
4d80: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
4d90: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
4da0: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
4db0: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
4dc0: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
4dd0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
4de0: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
4df0: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
4e00: 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63  t, u32 val){.  c
4e10: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74  har ac[4];.  put
4e20: 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b  32bits(ac, val);
4e30: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
4e40: 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c  3OsWrite(fd, ac,
4e50: 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a   4, offset);.}..
4e60: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
4e70: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
4e80: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
4e90: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
4ea0: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
4eb0: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
4ec0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
4ed0: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
4ee0: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
4ef0: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
4f00: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
4f10: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
4f20: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
4f30: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
4f40: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
4f50: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
4f60: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
4f70: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
4f80: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
4f90: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
4fa0: 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a  ->pMethods)../*.
4fb0: 2a 2a 20 49 66 20 66 69 6c 65 20 70 46 64 20 69  ** If file pFd i
4fc0: 73 20 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c  s open, call sql
4fd0: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f  ite3OsUnlock() o
4fe0: 6e 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  n it..*/.static 
4ff0: 69 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c  int osUnlock(sql
5000: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20  ite3_file *pFd, 
5010: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66  int eLock){.  if
5020: 28 20 21 69 73 4f 70 65 6e 28 70 46 64 29 20 29  ( !isOpen(pFd) )
5030: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
5040: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
5050: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e  turn sqlite3OsUn
5060: 6c 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29  lock(pFd, eLock)
5070: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
5080: 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69  function determi
5090: 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e  nes whether or n
50a0: 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ot the atomic-wr
50b0: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
50c0: 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20  .** can be used 
50d0: 77 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e  with this pager.
50e0: 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   The optimizatio
50f0: 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66  n can be used if
5100: 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65  :.**.**  (a) the
5110: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
5120: 62 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61  by OsDeviceChara
5130: 63 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64  cteristics() ind
5140: 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20  icates that.**  
5150: 20 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70      a database p
5160: 61 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74  age may be writt
5170: 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61  en atomically, a
5180: 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76  nd.**  (b) the v
5190: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
51a0: 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20   OsSectorSize() 
51b0: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
51c0: 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f  equal.**      to
51d0: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a   the page size..
51e0: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69  **.** The optimi
51f0: 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61  zation is also a
5200: 6c 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f  lways enabled fo
5210: 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
5220: 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65  s. It is.** an e
5230: 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69  rror to call thi
5240: 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50  s function if pP
5250: 61 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f  ager is opened o
5260: 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  n an in-memory.*
5270: 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  * database..**.*
5280: 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  * If the optimiz
5290: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ation cannot be 
52a0: 75 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72  used, 0 is retur
52b0: 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62  ned. If it can b
52c0: 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  e used,.** then 
52d0: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
52e0: 65 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ed is the size o
52f0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
5300: 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f  le when it.** co
5310: 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20  ntains rollback 
5320: 64 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79  data for exactly
5330: 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   one page..*/.#i
5340: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
5350: 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
5360: 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42  static int jrnlB
5370: 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20  ufferSize(Pager 
5380: 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65  *pPager){.  asse
5390: 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
53a0: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
53b0: 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  pFile ){.    int
53c0: 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   dc;            
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
53e0: 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74  * Device charact
53f0: 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20  eristics */.    
5400: 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20  int nSector;    
5410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5420: 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65    /* Sector size
5430: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61   */.    int szPa
5440: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
5450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
5460: 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61  e size */..    a
5470: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
5480: 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20  ager->fd) );.   
5490: 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   dc = sqlite3OsD
54a0: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
54b0: 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
54c0: 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20  ;.    nSector = 
54d0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
54e0: 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d  ze;.    szPage =
54f0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
5500: 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53  e;..    assert(S
5510: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
5520: 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
5530: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c  ;.    assert(SQL
5540: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
5550: 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29  64K==(65536>>8))
5560: 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63  ;.    if( 0==(dc
5570: 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
5580: 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38  TOMIC|(szPage>>8
5590: 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a  )) || nSector>sz
55a0: 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72  Page) ){.      r
55b0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
55c0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55   }..  return JOU
55d0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
55e0: 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47  er) + JOURNAL_PG
55f0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23  _SZ(pPager);.}.#
5600: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
5610: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
5620: 45 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68  ES is defined th
5630: 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61  en we do some sa
5640: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  nity checking.**
5650: 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73   on the cache us
5660: 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74  ing a hash funct
5670: 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73  ion.  This is us
5680: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a  ed for testing.*
5690: 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  * and debugging 
56a0: 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  only..*/.#ifdef 
56b0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
56c0: 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ES./*.** Return 
56d0: 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66  a 32-bit hash of
56e0: 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66   the page data f
56f0: 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  or pPage..*/.sta
5700: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61  tic u32 pager_da
5710: 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65  tahash(int nByte
5720: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
5730: 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68  *pData){.  u32 h
5740: 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ash = 0;.  int i
5750: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
5760: 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Byte; i++){.    
5770: 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33  hash = (hash*103
5780: 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20  9) + pData[i];. 
5790: 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68   }.  return hash
57a0: 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70  ;.}.static u32 p
57b0: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67  ager_pagehash(Pg
57c0: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72  Hdr *pPage){.  r
57d0: 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61  eturn pager_data
57e0: 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67  hash(pPage->pPag
57f0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75  er->pageSize, (u
5800: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
5810: 50 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a  Page->pData);.}.
5820: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
5830: 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50  r_set_pagehash(P
5840: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
5850: 70 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20  pPage->pageHash 
5860: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
5870: 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pPage);.}../*.*
5880: 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45  * The CHECK_PAGE
5890: 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50   macro takes a P
58a0: 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75  gHdr* as an argu
58b0: 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f  ment. If SQLITE_
58c0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69  CHECK_PAGES.** i
58d0: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e  s defined, and N
58e0: 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66  DEBUG is not def
58f0: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
5900: 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63  ) statement chec
5910: 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70  ks.** that the p
5920: 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69  age is either di
5930: 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74  rty or still mat
5940: 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61  ches the calcula
5950: 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a  ted page-hash..*
5960: 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  /.#define CHECK_
5970: 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67  PAGE(x) checkPag
5980: 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64  e(x).static void
5990: 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72   checkPage(PgHdr
59a0: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
59b0: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
59c0: 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28  Pager;.  assert(
59d0: 20 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20   !pPg->pageHash 
59e0: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
59f0: 64 65 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67  de.      || (pPg
5a00: 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
5a10: 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67  RTY) || pPg->pag
5a20: 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67  eHash==pager_pag
5a30: 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a  ehash(pPg) );.}.
5a40: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70  .#else.#define p
5a50: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c  ager_datahash(X,
5a60: 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61  Y)  0.#define pa
5a70: 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20  ger_pagehash(X) 
5a80: 20 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b   0.#define CHECK
5a90: 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20  _PAGE(x).#endif 
5aa0: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   /* SQLITE_CHECK
5ab0: 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _PAGES */../*.**
5ac0: 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
5ad0: 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lled the journal
5ae0: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
5af0: 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f  pPager must be o
5b00: 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e  pen..** This fun
5b10: 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
5b20: 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20  o read a master 
5b30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
5b40: 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65  e from the .** e
5b50: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61  nd of the file a
5b60: 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75  nd, if successfu
5b70: 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74  l, copies it int
5b80: 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65  o memory supplie
5b90: 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  d .** by the cal
5ba0: 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ler. See comment
5bb0: 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73  s above writeMas
5bc0: 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72  terJournal() for
5bd0: 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75   the format.** u
5be0: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d  sed to store a m
5bf0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
5c00: 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65  le name at the e
5c10: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
5c20: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73  file..**.** zMas
5c30: 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ter must point t
5c40: 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74  o a buffer of at
5c50: 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62   least nMaster b
5c60: 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ytes allocated b
5c70: 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e  y.** the caller.
5c80: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
5c90: 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
5ca0: 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73  thname+1 (to ens
5cb0: 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  ure there is.** 
5cc0: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20  enough space to 
5cd0: 77 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  write the master
5ce0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20   journal name). 
5cf0: 49 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  If the master jo
5d00: 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e  urnal.** name in
5d10: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
5d20: 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73  longer than nMas
5d30: 74 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75  ter bytes (inclu
5d40: 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65  ding a.** nul-te
5d50: 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20  rminator), then 
5d60: 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20  this is handled 
5d70: 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20  as if no master 
5d80: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20  journal name.** 
5d90: 77 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20  were present in 
5da0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
5db0: 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
5dc0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
5dd0: 20 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74   is present at t
5de0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
5df0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74  urnal.** file, t
5e00: 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64  hen it is copied
5e10: 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72   into the buffer
5e20: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
5e30: 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c  Master. A.** nul
5e40: 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
5e50: 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20   is appended to 
5e60: 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f  the buffer follo
5e70: 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a  wing the master.
5e80: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
5e90: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  name..**.** If i
5ea0: 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  t is determined 
5eb0: 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a  that no master j
5ec0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
5ed0: 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20   is present .** 
5ee0: 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65  zMaster[0] is se
5ef0: 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
5f00: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
5f10: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
5f20: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65   occurs while re
5f30: 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a  ading from the j
5f40: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20  ournal file, an 
5f50: 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20  SQLite.** error 
5f60: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
5f70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5f80: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
5f90: 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
5fa0: 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61  pJrnl, char *zMa
5fb0: 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65  ster, u32 nMaste
5fc0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
5fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fe0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
5ff0: 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20  */.  u32 len;   
6000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6010: 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74  /* Length in byt
6020: 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  es of master jou
6030: 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  rnal name */.  i
6040: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
6050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
6060: 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  al size in bytes
6070: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   of journal file
6080: 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20   pJrnl */.  u32 
6090: 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
60a0: 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65         /* MJ che
60b0: 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64  cksum value read
60c0: 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f   from journal */
60d0: 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20  .  u32 u;       
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
60f0: 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
6100: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69  ounter */.  unsi
6110: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
6120: 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66  [8];   /* A buff
6130: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
6140: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
6150: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c   zMaster[0] = '\
6160: 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54  0';..  if( SQLIT
6170: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
6180: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a  te3OsFileSize(pJ
6190: 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c  rnl, &szJ)).   |
61a0: 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53  | szJ<16.   || S
61b0: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
61c0: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
61d0: 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29  , szJ-16, &len))
61e0: 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73  .   || len>=nMas
61f0: 74 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54  ter .   || SQLIT
6200: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
6210: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a  32bits(pJrnl, sz
6220: 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20  J-12, &cksum)). 
6230: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
6240: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52  (rc = sqlite3OsR
6250: 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69  ead(pJrnl, aMagi
6260: 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20  c, 8, szJ-8)).  
6270: 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69   || memcmp(aMagi
6280: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
6290: 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  , 8).   || SQLIT
62a0: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
62b0: 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c  te3OsRead(pJrnl,
62c0: 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73   zMaster, len, s
62d0: 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b  zJ-16-len)).  ){
62e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
62f0: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66    }..  /* See if
6300: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61   the checksum ma
6310: 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72  tches the master
6320: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f   journal name */
6330: 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65  .  for(u=0; u<le
6340: 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  n; u++){.    cks
6350: 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d  um -= zMaster[u]
6360: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75  ;.  }.  if( cksu
6370: 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  m ){.    /* If t
6380: 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73  he checksum does
6390: 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e  n't add up, then
63a0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
63b0: 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73  the disk sectors
63c0: 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  .    ** containi
63d0: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
63e0: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
63f0: 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69  s corrupted. Thi
6400: 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64  s means.    ** d
6410: 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62  efinitely roll b
6420: 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74  ack, so just ret
6430: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  urn SQLITE_OK an
6440: 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29  d report a (nul)
6450: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a  .    ** master-j
6460: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  ournal filename.
6470: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20  .    */.    len 
6480: 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  = 0;.  }.  zMast
6490: 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a  er[len] = '\0';.
64a0: 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c     .  return SQL
64b0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
64c0: 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73   Return the offs
64d0: 65 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  et of the sector
64e0: 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20   boundary at or 
64f0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20  immediately .** 
6500: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61  following the va
6510: 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a  lue in pPager->j
6520: 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d  ournalOff, assum
6530: 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a  ing a sector .**
6540: 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d   size of pPager-
6550: 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65  >sectorSize byte
6560: 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72  s..**.** i.e for
6570: 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f   a sector size o
6580: 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50  f 512:.**.**   P
6590: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
65a0: 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20           Return 
65b0: 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  value.**   -----
65c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65e0: 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20  --.**   0       
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6600: 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20    0.**   512    
6610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6620: 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20     512.**   100 
6630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6640: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32        512.**   2
6650: 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  000             
6660: 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a           2048.**
6670: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20   .*/.static i64 
6680: 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
6690: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
66a0: 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20  .  i64 offset = 
66b0: 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61  0;.  i64 c = pPa
66c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
66d0: 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20  .  if( c ){.    
66e0: 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f  offset = ((c-1)/
66f0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
6700: 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f  Pager) + 1) * JO
6710: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
6720: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ger);.  }.  asse
6730: 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e  rt( offset%JOURN
6740: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
6750: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
6760: 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20  ( offset>=c );. 
6770: 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74   assert( (offset
6780: 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -c)<JOURNAL_HDR_
6790: 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
67a0: 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d  return offset;.}
67b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
67c0: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
67d0: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
67e0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
67f0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ed..**.** This f
6800: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
6810: 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  op if the journa
6820: 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62  l file has not b
6830: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a  een written to.*
6840: 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72  * within the cur
6850: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
6860: 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e   (i.e. if Pager.
6870: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a  journalOff==0)..
6880: 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63  **.** If doTrunc
6890: 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  ate is non-zero 
68a0: 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75  or the Pager.jou
68b0: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61  rnalSizeLimit va
68c0: 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74  riable is.** set
68d0: 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e   to 0, then trun
68e0: 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  cate the journal
68f0: 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79   file to zero by
6900: 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68  tes in size. Oth
6910: 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20  erwise,.** zero 
6920: 74 68 65 20 32 38 2d 62 79 74 65 20 68 65 61 64  the 28-byte head
6930: 65 72 20 61 74 20 74 68 65 20 73 74 61 72 74 20  er at the start 
6940: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
6950: 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63  ile. In either c
6960: 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20  ase, .** if the 
6970: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
6980: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79  no-sync mode, sy
6990: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
69a0: 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ile immediately 
69b0: 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e  .** after writin
69c0: 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
69d0: 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67  it..**.** If Pag
69e0: 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  er.journalSizeLi
69f0: 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20 61 20  mit is set to a 
6a00: 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65  positive, non-ze
6a10: 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a  ro value, and.**
6a20: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74   following the t
6a30: 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72  runcation or zer
6a40: 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64 20 61  oing described a
6a50: 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66  bove the size of
6a60: 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c   the .** journal
6a70: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69   file in bytes i
6a80: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
6a90: 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  is value, then t
6aa0: 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a  runcate the.** j
6ab0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50  ournal file to P
6ac0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
6ad0: 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65  Limit bytes. The
6ae0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
6af0: 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74  es.** not need t
6b00: 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c  o be synced foll
6b10: 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61  owing this opera
6b20: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tion..**.** If a
6b30: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
6b40: 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65  s, abandon proce
6b50: 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  ssing and return
6b60: 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
6b70: 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  de..** Otherwise
6b80: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
6b90: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
6ba0: 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  t zeroJournalHdr
6bb0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
6bc0: 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b  int doTruncate){
6bd0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
6be0: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c00: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
6c10: 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ode */.  assert(
6c20: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
6c30: 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50  jfd) );.  if( pP
6c40: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6c50: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36   ){.    const i6
6c60: 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65  4 iLimit = pPage
6c70: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
6c80: 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  mit;    /* Local
6c90: 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f   cache of jsl */
6ca0: 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  ..    IOTRACE(("
6cb0: 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20  JZEROHDR %p\n", 
6cc0: 70 50 61 67 65 72 29 29 0a 20 20 20 20 69 66 28  pPager)).    if(
6cd0: 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69   doTruncate || i
6ce0: 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Limit==0 ){.    
6cf0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6d00: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
6d10: 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65  >jfd, 0);.    }e
6d20: 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69  lse{.      stati
6d30: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72  c const char zer
6d40: 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a  oHdr[28] = {0};.
6d50: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6d60: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
6d70: 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20  ->jfd, zeroHdr, 
6d80: 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c  sizeof(zeroHdr),
6d90: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
6da0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6db0: 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
6dc0: 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
6dd0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
6de0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
6df0: 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
6e00: 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  Y|pPager->sync_f
6e10: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  lags);.    }..  
6e20: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
6e30: 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nt the transacti
6e40: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20  on is committed 
6e50: 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f  but the write lo
6e60: 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74  ck .    ** is st
6e70: 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ill held on the 
6e80: 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
6e90: 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63  s a size limit c
6ea0: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20  onfigured for . 
6eb0: 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73     ** the persis
6ec0: 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  tent journal and
6ed0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6ee0: 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73  e currently cons
6ef0: 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a  umes more.    **
6f00: 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74   space than that
6f10: 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f   limit allows fo
6f20: 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e  r, truncate it n
6f30: 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  ow. There is no 
6f40: 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73  need.    ** to s
6f50: 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c  ync the file fol
6f60: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
6f70: 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
6f80: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6f90: 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20  _OK && iLimit>0 
6fa0: 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b  ){.      i64 sz;
6fb0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
6fc0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
6fd0: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b  ager->jfd, &sz);
6fe0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
6ff0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69  QLITE_OK && sz>i
7000: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
7010: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
7020: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
7030: 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  jfd, iLimit);.  
7040: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7050: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7060: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
7070: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
7080: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f  pen when this ro
7090: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
70a0: 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65   A journal.** he
70b0: 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  ader (JOURNAL_HD
70c0: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77  R_SZ bytes) is w
70d0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
70e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20  journal file at 
70f0: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c  the.** current l
7100: 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ocation..**.** T
7110: 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68  he format for th
7120: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
7130: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
7140: 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61  ** - 8 bytes: Ma
7150: 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20  gic identifying 
7160: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a  journal format..
7170: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75  ** - 4 bytes: Nu
7180: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
7190: 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d  in journal, or -
71a0: 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69  1 no-sync mode i
71b0: 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  s on..** - 4 byt
71c0: 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65  es: Random numbe
71d0: 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20  r used for page 
71e0: 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  hash..** - 4 byt
71f0: 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61  es: Initial data
7200: 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e  base page count.
7210: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53  .** - 4 bytes: S
7220: 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20  ector size used 
7230: 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  by the process t
7240: 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a  hat wrote this j
7250: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62  ournal..** - 4 b
7260: 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70  ytes: Database p
7270: 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a  age size..** .**
7280: 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f   Followed by (JO
7290: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
72a0: 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73  8) bytes of unus
72b0: 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  ed space..*/.sta
72c0: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75  tic int writeJou
72d0: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
72e0: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
72f0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
7300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7310: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
7320: 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20    char *zHeader 
7330: 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
7340: 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61  ace;  /* Tempora
7350: 72 79 20 73 70 61 63 65 20 75 73 65 64 20 74 6f  ry space used to
7360: 20 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f   build header */
7370: 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d  .  u32 nHeader =
7380: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
7390: 65 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  e;     /* Size o
73a0: 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  f buffer pointed
73b0: 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a   to by zHeader *
73c0: 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20  /.  u32 nWrite; 
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73e0: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
73f0: 20 6f 66 20 68 65 61 64 65 72 20 73 65 63 74 6f   of header secto
7400: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69  r written */.  i
7410: 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
7420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7430: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
7440: 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
7450: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
7460: 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20  jfd) );      /* 
7470: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  Journal file mus
7480: 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20  t be open. */.. 
7490: 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55   if( nHeader>JOU
74a0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
74b0: 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  er) ){.    nHead
74c0: 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  er = JOURNAL_HDR
74d0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
74e0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
74f0: 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70  are active savep
7500: 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66  oints and any of
7510: 20 74 68 65 6d 20 77 65 72 65 20 63 72 65 61 74   them were creat
7520: 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74  ed .  ** since t
7530: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a  he most recent j
7540: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61  ournal header wa
7550: 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74  s written, updat
7560: 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65  e the .  ** Page
7570: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
7580: 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77  ffset fields now
7590: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
75a0: 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
75b0: 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
75c0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
75d0: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
75e0: 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b  iHdrOffset==0 ){
75f0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
7600: 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48  Savepoint[ii].iH
7610: 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  drOffset = pPage
7620: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
7630: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
7640: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
7650: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7660: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
7670: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
7680: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74  .  /* .  ** Writ
7690: 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64  e the nRec Field
76a0: 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66   - the number of
76b0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68   page records th
76c0: 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20  at follow this. 
76d0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
76e0: 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65  er. Normally, ze
76f0: 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ro is written to
7700: 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74   this value at t
7710: 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41  his time..  ** A
7720: 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73  fter the records
7730: 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68   are added to th
7740: 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74  e journal (and t
7750: 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65  he journal synce
7760: 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66  d, .  ** if in f
7770: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20  ull-sync mode), 
7780: 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72  the zero is over
7790: 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65  written with the
77a0: 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a   true number.  *
77b0: 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65  * of records (se
77c0: 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29  e syncJournal())
77d0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61  ..  **.  ** A fa
77e0: 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65  ster alternative
77f0: 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46   is to write 0xF
7800: 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e  FFFFFFF to the n
7810: 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a  Rec field. When.
7820: 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65    ** reading the
7830: 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61   journal this va
7840: 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65  lue tells SQLite
7850: 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20   to assume that 
7860: 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66  the.  ** rest of
7870: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7880: 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64  e contains valid
7890: 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54   page records. T
78a0: 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20  his assumption. 
78b0: 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73   ** is dangerous
78c0: 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72  , as if a failur
78d0: 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73  e occurred whils
78e0: 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  t writing to the
78f0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
7900: 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69  le it may contai
7910: 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64  n some garbage d
7920: 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74  ata. There are t
7930: 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a  wo scenarios.  *
7940: 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73  * where this ris
7950: 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  k can be ignored
7960: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  :.  **.  **   * 
7970: 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69  When the pager i
7980: 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  s in no-sync mod
7990: 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61  e. Corruption ca
79a0: 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20  n follow a.  ** 
79b0: 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72      power failur
79c0: 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61  e in this case a
79d0: 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nyway..  **.  **
79e0: 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51     * When the SQ
79f0: 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
7a00: 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73  APPEND flag is s
7a10: 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74  et. This guarant
7a20: 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61  ees.  **     tha
7a30: 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69  t garbage data i
7a40: 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64  s never appended
7a50: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
7a60: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  file..  */.  ass
7a70: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
7a80: 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
7a90: 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69  r->noSync );.  i
7aa0: 66 28 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( (pPager->noSy
7ab0: 6e 63 29 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e  nc) || (pPager->
7ac0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
7ad0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
7ae0: 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71  EMORY).   || (sq
7af0: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
7b00: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
7b10: 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f  ger->fd)&SQLITE_
7b20: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
7b30: 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d  D) .  ){.    mem
7b40: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
7b50: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
7b60: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
7b70: 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74  ));.    put32bit
7b80: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
7b90: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
7ba0: 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a  ], 0xffffffff);.
7bb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 48 65    }else{.    zHe
7bc0: 61 64 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ader[0] = '\0';.
7bd0: 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
7be0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
7bf0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30  ournalMagic)], 0
7c00: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
7c10: 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61   random check-ha
7c20: 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a  sh initialiser *
7c30: 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  / .  sqlite3_ran
7c40: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70  domness(sizeof(p
7c50: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
7c60: 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  ), &pPager->cksu
7c70: 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62  mInit);.  put32b
7c80: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
7c90: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
7ca0: 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63  c)+4], pPager->c
7cb0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20  ksumInit);.  /* 
7cc0: 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61  The initial data
7cd0: 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  base size */.  p
7ce0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
7cf0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
7d00: 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67  lMagic)+8], pPag
7d10: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b  er->dbOrigSize);
7d20: 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65  .  /* The assume
7d30: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f  d sector size fo
7d40: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a  r this process *
7d50: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
7d60: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
7d70: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d  ournalMagic)+12]
7d80: 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  , pPager->sector
7d90: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  Size);..  /* The
7da0: 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
7db0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
7dc0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
7dd0: 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50  alMagic)+16], pP
7de0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
7df0: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
7e00: 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20  ing the tail of 
7e10: 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f  the buffer is no
7e20: 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76  t necessary.  Ev
7e30: 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f  erything.  ** wo
7e40: 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65 20  rks find if the 
7e50: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74  following memset
7e60: 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20  () is omitted.  
7e70: 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  But initializing
7e80: 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79  .  ** the memory
7e90: 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69   prevents valgri
7ea0: 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e  nd from complain
7eb0: 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77  ing, so we are w
7ec0: 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74  illing to.  ** t
7ed0: 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ake the performa
7ee0: 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20  nce hit..  */.  
7ef0: 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b  memset(&zHeader[
7f00: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
7f10: 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20  agic)+20], 0,.  
7f20: 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28         nHeader-(
7f30: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
7f40: 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f  agic)+20));..  /
7f50: 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74 20  * In theory, it 
7f60: 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72  is only necessar
7f70: 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 32  y to write the 2
7f80: 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68 65  8 bytes that the
7f90: 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68   .  ** journal h
7fa0: 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20 74  eader consumes t
7fb0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
7fc0: 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69 6e  le here. Then in
7fd0: 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a  crement the .  *
7fe0: 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  * Pager.journalO
7ff0: 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20 4a  ff variable by J
8000: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f  OURNAL_HDR_SZ so
8010: 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 0a   that the next .
8020: 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 77    ** record is w
8030: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 6f  ritten to the fo
8040: 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20 28  llowing sector (
8050: 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69 6e  leaving a gap in
8060: 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74   the file.  ** t
8070: 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c  hat will be impl
8080: 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e  icitly filled in
8090: 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a   by the OS)..  *
80a0: 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 69  *.  ** However i
80b0: 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63 6f  t has been disco
80c0: 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73 6f  vered that on so
80d0: 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73 20  me systems this 
80e0: 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a  pattern can .  *
80f0: 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e 74  * be significant
8100: 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20 63  ly slower than c
8110: 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69 74  ontiguously writ
8120: 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20  ing data to the 
8130: 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20  file,.  ** even 
8140: 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65 78  if that means ex
8150: 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e 67  plicitly writing
8160: 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c 6f   data to the blo
8170: 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55  ck of .  ** (JOU
8180: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
8190: 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69 6c  ) bytes that wil
81a0: 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 53  l not be used. S
81b0: 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a 20  o that is what. 
81c0: 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20   ** is done. .  
81d0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70  **.  ** The loop
81e0: 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65 72   is required her
81f0: 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 65  e in case the se
8200: 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72  ctor-size is lar
8210: 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20  ger than the .  
8220: 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ** database page
8230: 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68 65   size. Since the
8240: 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72 20   zHeader buffer 
8250: 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61  is only Pager.pa
8260: 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65  geSize.  ** byte
8270: 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20  s in size, more 
8280: 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f  than one call to
8290: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
82a0: 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72 65  ) may be require
82b0: 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61  d.  ** to popula
82c0: 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  te the entire jo
82d0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63  urnal header sec
82e0: 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72  tor..  */ .  for
82f0: 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53  (nWrite=0; rc==S
8300: 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65  QLITE_OK&&nWrite
8310: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
8320: 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b  pPager); nWrite+
8330: 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20 49  =nHeader){.    I
8340: 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
8350: 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
8360: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
8370: 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72  rnalHdr, nHeader
8380: 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
8390: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
83a0: 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
83b0: 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65 72   nHeader, pPager
83c0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
83d0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
83e0: 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72  alOff += nHeader
83f0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
8400: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
8410: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
8420: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
8430: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20  this is called. 
8440: 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  A journal header
8450: 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41   file.** (JOURNA
8460: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
8470: 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  is read from the
8480: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
8490: 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n in the journal
84a0: 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75  .** file. The cu
84b0: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69  rrent location i
84c0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
84d0: 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a  le is given by.*
84e0: 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  * pPager->journa
84f0: 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  lOff. See commen
8500: 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f  ts above functio
8510: 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  n writeJournalHd
8520: 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73  r() for.** a des
8530: 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
8540: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
8550: 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormat..**.** If 
8560: 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65  the header is re
8570: 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ad successfully,
8580: 20 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20 74   *pNRec is set t
8590: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
85a0: 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  ** page records 
85b0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68  following this h
85c0: 65 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69  eader and *pDbSi
85d0: 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
85e0: 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
85f0: 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
8600: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
8610: 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e  began, in pages.
8620: 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63   Also, pPager->c
8630: 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73  ksumInit.** is s
8640: 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
8650: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
8660: 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51  urnal header. SQ
8670: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
8680: 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ned.** in this c
8690: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
86a0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
86b0: 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f   file appears to
86c0: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53   be corrupted, S
86d0: 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a  QLITE_DONE is.**
86e0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
86f0: 4e 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a  NRec and *PDbSiz
8700: 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e  e are undefined.
8710: 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52    If JOURNAL_HDR
8720: 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e  _SZ bytes.** can
8730: 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d  not be read from
8740: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
8750: 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  e an error code 
8760: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
8770: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a  static int readJ
8780: 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67  ournalHdr(.  Pag
8790: 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
87a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
87b0: 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
87c0: 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20  nt isHot,.  i64 
87d0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20  journalSize,    
87e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
87f0: 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75   of the open jou
8800: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
8810: 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52  es */.  u32 *pNR
8820: 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ec,             
8830: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c       /* OUT: Val
8840: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
8850: 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20   nRec field */. 
8860: 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20   u32 *pDbSize   
8870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8880: 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f   OUT: Value of o
8890: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
88a0: 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29   size field */.)
88b0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
88c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88d0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
88e0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
88f0: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20  ar aMagic[8];   
8900: 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f    /* A buffer to
8910: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
8920: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20  header */.  i64 
8930: 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
8940: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
8950: 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65  et of journal he
8960: 61 64 65 72 20 62 65 69 6e 67 20 72 65 61 64 20  ader being read 
8970: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73  */..  assert( is
8980: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
8990: 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75  ) );      /* Jou
89a0: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
89b0: 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a  e open. */..  /*
89c0: 20 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a   Advance Pager.j
89d0: 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65  ournalOff to the
89e0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65   start of the ne
89f0: 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68  xt sector. If th
8a00: 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  e.  ** journal f
8a10: 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c  ile is too small
8a20: 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65   for there to be
8a30: 20 61 20 68 65 61 64 65 72 20 73 74 6f 72 65 64   a header stored
8a40: 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f   at this.  ** po
8a50: 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  int, return SQLI
8a60: 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20  TE_DONE..  */.  
8a70: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8a80: 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
8a90: 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
8aa0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
8ab0: 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f  rnalOff+JOURNAL_
8ac0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e  HDR_SZ(pPager) >
8ad0: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a   journalSize ){.
8ae0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8af0: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48  E_DONE;.  }.  iH
8b00: 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
8b10: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f  journalOff;..  /
8b20: 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 66 69  * Read in the fi
8b30: 72 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74  rst 8 bytes of t
8b40: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
8b50: 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f  r. If they do no
8b60: 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65  t match.  ** the
8b70: 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66    magic string f
8b80: 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74 61 72  ound at the star
8b90: 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61  t of each journa
8ba0: 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e  l header, return
8bb0: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  .  ** SQLITE_DON
8bc0: 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  E. If an IO erro
8bd0: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
8be0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20   an error code. 
8bf0: 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20  Otherwise,.  ** 
8c00: 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20  proceed..  */.  
8c10: 69 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64  if( isHot || iHd
8c20: 72 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f  rOff!=pPager->jo
8c30: 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20  urnalHdr ){.    
8c40: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
8c50: 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
8c60: 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  aMagic, sizeof(a
8c70: 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29  Magic), iHdrOff)
8c80: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
8c90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
8ca0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d  .    }.    if( m
8cb0: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
8cc0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
8cd0: 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20  eof(aMagic))!=0 
8ce0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8cf0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
8d00: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61   }.  }..  /* Rea
8d10: 64 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  d the first thre
8d20: 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20  e 32-bit fields 
8d30: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
8d40: 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a  eader: The nRec.
8d50: 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20    ** field, the 
8d60: 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c  checksum-initial
8d70: 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61 74  izer and the dat
8d80: 61 62 61 73 65 20 73 69 7a 65 20 61 74 20 74 68  abase size at th
8d90: 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20  e start.  ** of 
8da0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
8db0: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
8dc0: 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
8dd0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20  g goes wrong..  
8de0: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
8df0: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
8e00: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
8e10: 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52  , iHdrOff+8, pNR
8e20: 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  ec)).   || SQLIT
8e30: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
8e40: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
8e50: 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20  fd, iHdrOff+12, 
8e60: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
8e70: 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  it)).   || SQLIT
8e80: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
8e90: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
8ea0: 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20  fd, iHdrOff+16, 
8eb0: 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20  pDbSize)).  ){. 
8ec0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
8ed0: 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
8ee0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29  >journalOff==0 )
8ef0: 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67 65 53  {.    u32 iPageS
8f00: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
8f10: 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20     /* Page-size 
8f20: 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c  field of journal
8f30: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75   header */.    u
8f40: 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20  32 iSectorSize; 
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8f60: 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64  ector-size field
8f70: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
8f80: 65 72 20 2a 2f 0a 20 20 20 20 75 31 36 20 69 50  er */.    u16 iP
8f90: 61 67 65 53 69 7a 65 31 36 3b 20 20 20 20 20 20  ageSize16;      
8fa0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
8fb0: 66 20 69 50 61 67 65 53 69 7a 65 20 69 6e 20 31  f iPageSize in 1
8fc0: 36 2d 62 69 74 20 76 61 72 69 61 62 6c 65 20 2a  6-bit variable *
8fd0: 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  /..    /* Read t
8fe0: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
8ff0: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75   sector-size jou
9000: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 65 6c  rnal header fiel
9010: 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 53  ds. */.    if( S
9020: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
9030: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
9040: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
9050: 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65  20, &iSectorSize
9060: 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54  )).     || SQLIT
9070: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
9080: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
9090: 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c 20  fd, iHdrOff+24, 
90a0: 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20 20 20  &iPageSize)).   
90b0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
90c0: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
90d0: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
90e0: 65 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72  e values read fr
90f0: 6f 6d 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  om the page-size
9100: 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
9110: 20 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61   fields.    ** a
9120: 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e  re within range.
9130: 20 54 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65   To be 'in range
9140: 27 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e  ', both values n
9150: 65 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  eed to be a powe
9160: 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20  r.    ** of two 
9170: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
9180: 65 71 75 61 6c 20 74 6f 20 35 31 32 2c 20 61 6e  equal to 512, an
9190: 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68  d not greater th
91a0: 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a  an their .    **
91b0: 20 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70   respective comp
91c0: 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d  ile time maximum
91d0: 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a   limits..    */.
91e0: 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a      if( iPageSiz
91f0: 65 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20  e<512           
9200: 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f         || iSecto
9210: 72 53 69 7a 65 3c 35 31 32 0a 20 20 20 20 20 7c  rSize<512.     |
9220: 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49  | iPageSize>SQLI
9230: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
9240: 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e   || iSectorSize>
9250: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a  MAX_SECTOR_SIZE.
9260: 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53       || ((iPageS
9270: 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65  ize-1)&iPageSize
9280: 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63  )!=0   || ((iSec
9290: 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74  torSize-1)&iSect
92a0: 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20  orSize)!=0 .    
92b0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
92c0: 68 65 20 65 69 74 68 65 72 20 74 68 65 20 70 61  he either the pa
92d0: 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f  ge-size or secto
92e0: 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f  r-size in the jo
92f0: 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20  urnal-header is 
9300: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69  .      ** invali
9310: 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63  d, then the proc
9320: 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74  ess that wrote t
9330: 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  he journal-heade
9340: 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20  r must have .   
9350: 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65     ** crashed be
9360: 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 20  fore the header 
9370: 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74  was synced. In t
9380: 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65  his case stop re
9390: 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20  ading .      ** 
93a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
93b0: 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   here..      */.
93c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
93d0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
93e0: 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
93f0: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20  he page-size to 
9400: 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20  match the value 
9410: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
9420: 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55  urnal. .    ** U
9430: 73 65 20 61 20 74 65 73 74 63 61 73 65 28 29 20  se a testcase() 
9440: 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75  macro to make su
9450: 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66  re that malloc f
9460: 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20  ailure within . 
9470: 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61     ** PagerSetPa
9480: 67 65 73 69 7a 65 28 29 20 69 73 20 74 65 73 74  gesize() is test
9490: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
94a0: 50 61 67 65 53 69 7a 65 31 36 20 3d 20 28 75 31  PageSize16 = (u1
94b0: 36 29 69 50 61 67 65 53 69 7a 65 3b 0a 20 20 20  6)iPageSize;.   
94c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
94d0: 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50  erSetPagesize(pP
94e0: 61 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65  ager, &iPageSize
94f0: 31 36 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73  16, -1);.    tes
9500: 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
9510: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  E_OK );.    asse
9520: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
9530: 4b 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 31 36  K || iPageSize16
9540: 3d 3d 28 75 31 36 29 69 50 61 67 65 53 69 7a 65  ==(u16)iPageSize
9550: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61   );..    /* Upda
9560: 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73  te the assumed s
9570: 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61  ector-size to ma
9580: 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73  tch the value us
9590: 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68  ed by .    ** th
95a0: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
95b0: 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72  reated this jour
95c0: 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75  nal. If this jou
95d0: 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20  rnal was.    ** 
95e0: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
95f0: 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20  cess other than 
9600: 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74  this one, then t
9610: 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20  his routine.    
9620: 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  ** is being call
9630: 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70  ed from within p
9640: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e  ager_playback().
9650: 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   The local value
9660: 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72  .    ** of Pager
9670: 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72  .sectorSize is r
9680: 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65  estored at the e
9690: 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69  nd of that routi
96a0: 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ne..    */.    p
96b0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
96c0: 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  e = iSectorSize;
96d0: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
96e0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
96f0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
9700: 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
9710: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  c;.}.../*.** Wri
9720: 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  te the supplied 
9730: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
9740: 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ame into the jou
9750: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
9760: 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74  ger.** pPager at
9770: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
9780: 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65  ation. The maste
9790: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
97a0: 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a  ust be the last.
97b0: 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e  ** thing written
97c0: 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   to a journal fi
97d0: 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  le. If the pager
97e0: 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   is in full-sync
97f0: 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f   mode, the.** jo
9800: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
9810: 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65  iptor is advance
9820: 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  d to the next se
9830: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65  ctor boundary be
9840: 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67  fore.** anything
9850: 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65   is written. The
9860: 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a   format is:.**.*
9870: 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50  *   + 4 bytes: P
9880: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a  AGER_MJ_PGNO..**
9890: 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61     + N bytes: Ma
98a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
98b0: 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a  ename in utf-8..
98c0: 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
98d0: 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73  N (length of mas
98e0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
98f0: 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75   in bytes, no nu
9900: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a  l-terminator)..*
9910: 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d  *   + 4 bytes: M
9920: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
9930: 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  me checksum..** 
9940: 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f    + 8 bytes: aJo
9950: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
9960: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
9970: 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63  ournal page chec
9980: 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20  ksum is the sum 
9990: 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  of the bytes in 
99a0: 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  the master.** jo
99b0: 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72  urnal name, wher
99c0: 65 20 65 61 63 68 20 62 79 74 65 20 69 73 20 69  e each byte is i
99d0: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20  nterpreted as a 
99e0: 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74  signed 8-bit int
99f0: 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  eger..**.** If z
9a00: 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c  Master is a NULL
9a10: 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73   pointer (occurs
9a20: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61   for a single da
9a30: 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
9a40: 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61  on), .** this ca
9a50: 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ll is a no-op..*
9a60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
9a70: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
9a80: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
9a90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
9aa0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
9ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ac0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
9ad0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
9ae0: 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20  nMaster;        
9af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9b00: 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67  Length of string
9b10: 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36   zMaster */.  i6
9b20: 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
9b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9b40: 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64  * Offset of head
9b50: 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69  er in journal fi
9b60: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c  le */.  i64 jrnl
9b70: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
9b80: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
9b90: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   of journal file
9ba0: 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33   on disk */.  u3
9bb0: 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20  2 cksum = 0;    
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9bd0: 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74  * Checksum of st
9be0: 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  ring zMaster */.
9bf0: 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20  .  if( !zMaster 
9c00: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  || pPager->setMa
9c10: 73 74 65 72 0a 20 20 20 7c 7c 20 70 50 61 67 65  ster.   || pPage
9c20: 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
9c30: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
9c40: 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20  E_MEMORY .   || 
9c50: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
9c60: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9c70: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b  ALMODE_OFF .  ){
9c80: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9c90: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61  TE_OK;.  }.  pPa
9ca0: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
9cb0: 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   1;.  assert( is
9cc0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
9cd0: 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75  ) );..  /* Calcu
9ce0: 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20  late the length 
9cf0: 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74 68 65  in bytes and the
9d00: 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61   checksum of zMa
9d10: 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d  ster */.  for(nM
9d20: 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72  aster=0; zMaster
9d30: 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74  [nMaster]; nMast
9d40: 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d  er++){.    cksum
9d50: 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73   += zMaster[nMas
9d60: 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ter];.  }..  /* 
9d70: 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
9d80: 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
9d90: 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
9da0: 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
9db0: 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
9dc0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
9dd0: 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
9de0: 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
9df0: 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
9e00: 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
9e10: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
9e20: 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
9e30: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
9e40: 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  lSync ){.    pPa
9e50: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
9e60: 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
9e70: 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  et(pPager);.  }.
9e80: 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67    iHdrOff = pPag
9e90: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
9ea0: 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
9eb0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64  master journal d
9ec0: 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ata to the end o
9ed0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
9ee0: 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  le. If.  ** an e
9ef0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
9f00: 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
9f10: 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
9f20: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20  ..  */.  if( (0 
9f30: 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
9f40: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
9f50: 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52  , iHdrOff, PAGER
9f60: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
9f70: 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
9f80: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57  (rc = sqlite3OsW
9f90: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
9fa0: 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74  , zMaster, nMast
9fb0: 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29  er, iHdrOff+4)))
9fc0: 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
9fd0: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
9fe0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
9ff0: 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e  Off+4+nMaster, n
a000: 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20  Master))).   || 
a010: 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
a020: 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
a030: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  jfd, iHdrOff+4+n
a040: 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29  Master+4, cksum)
a050: 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
a060: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
a070: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
a080: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
a090: 38 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  8, iHdrOff+4+nMa
a0a0: 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20  ster+8))).  ){. 
a0b0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
a0c0: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
a0d0: 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74  nalOff += (nMast
a0e0: 65 72 2b 32 30 29 3b 0a 20 20 70 50 61 67 65 72  er+20);.  pPager
a0f0: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50  ->needSync = !pP
a100: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a 20  ager->noSync;.. 
a110: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
a120: 20 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74   is in peristent
a130: 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74  -journal mode, t
a140: 68 65 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c  hen the physical
a150: 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66   .  ** journal-f
a160: 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70  ile may extend p
a170: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
a180: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
a190: 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20  l name.  ** and 
a1a0: 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63  8 bytes of magic
a1b0: 20 64 61 74 61 20 6a 75 73 74 20 77 72 69 74 74   data just writt
a1c0: 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20  en to the file. 
a1d0: 54 68 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61  This is .  ** da
a1e0: 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73 65 20  ngerous because 
a1f0: 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c  the code to roll
a200: 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
a210: 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c  al file.  ** wil
a220: 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f  l not be able to
a230: 20 66 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72   find the master
a240: 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f  -journal name to
a250: 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a   determine .  **
a260: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
a270: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68  the journal is h
a280: 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  ot. .  **.  ** E
a290: 61 73 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20  asiest thing to 
a2a0: 64 6f 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61  do in this scena
a2b0: 72 69 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61  rio is to trunca
a2c0: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  te the journal .
a2d0: 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65    ** file to the
a2e0: 20 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a   required size..
a2f0: 20 20 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49    */ .  if( SQLI
a300: 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c  TE_OK==(rc = sql
a310: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
a320: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e  Pager->jfd, &jrn
a330: 6c 53 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72  lSize)).   && jr
a340: 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a  nlSize>pPager->j
a350: 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20  ournalOff.  ){. 
a360: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
a370: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
a380: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
a390: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a  ournalOff);.  }.
a3a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
a3b0: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67  /*.** Find a pag
a3c0: 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61  e in the hash ta
a3d0: 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61  ble given its pa
a3e0: 67 65 20 6e 75 6d 62 65 72 2e 20 52 65 74 75 72  ge number. Retur
a3f0: 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
a400: 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55  o the page or NU
a410: 4c 4c 20 69 66 20 74 68 65 20 72 65 71 75 65 73  LL if the reques
a420: 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20  ted page is not 
a430: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 6d  .** already in m
a440: 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
a450: 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f   PgHdr *pager_lo
a460: 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67  okup(Pager *pPag
a470: 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
a480: 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20    PgHdr *p;     
a490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4a0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
a4b0: 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20  lue */..  /* It 
a4c0: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
a4d0: 66 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20 50 63  for a call to Pc
a4e0: 61 63 68 65 46 65 74 63 68 28 29 20 77 69 74 68  acheFetch() with
a4f0: 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 30 20 74   createFlag==0 t
a500: 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e  o.  ** fail, sin
a510: 63 65 20 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f  ce no attempt to
a520: 20 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69   allocate dynami
a530: 63 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65  c memory will be
a540: 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76   made..  */.  (v
a550: 6f 69 64 29 73 71 6c 69 74 65 33 50 63 61 63 68  oid)sqlite3Pcach
a560: 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70  eFetch(pPager->p
a570: 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c  PCache, pgno, 0,
a580: 20 26 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70   &p);.  return p
a590: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  ;.}../*.** Unles
a5a0: 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  s the pager is i
a5b0: 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 64  n error-state, d
a5c0: 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65  iscard all in-me
a5d0: 6d 6f 72 79 20 70 61 67 65 73 2e 20 49 66 0a 2a  mory pages. If.*
a5e0: 2a 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  * the pager is i
a5f0: 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 74  n error-state, t
a600: 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 20 69 73  hen this call is
a610: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
a620: 54 4f 44 4f 3a 20 57 68 79 20 63 61 6e 20 77 65  TODO: Why can we
a630: 20 6e 6f 74 20 72 65 73 65 74 20 74 68 65 20 70   not reset the p
a640: 61 67 65 72 20 77 68 69 6c 65 20 69 6e 20 65 72  ager while in er
a650: 72 6f 72 20 73 74 61 74 65 3f 0a 2a 2f 0a 73 74  ror state?.*/.st
a660: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
a670: 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  reset(Pager *pPa
a680: 67 65 72 29 7b 0a 20 20 69 66 28 20 53 51 4c 49  ger){.  if( SQLI
a690: 54 45 5f 4f 4b 3d 3d 70 50 61 67 65 72 2d 3e 65  TE_OK==pPager->e
a6a0: 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 73 71  rrCode ){.    sq
a6b0: 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61  lite3BackupResta
a6c0: 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  rt(pPager->pBack
a6d0: 75 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  up);.    sqlite3
a6e0: 50 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67  PcacheClear(pPag
a6f0: 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
a700: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
a710: 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Valid = 0;.  }.}
a720: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
a730: 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74   structures in t
a740: 68 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  he Pager.aSavepo
a750: 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20  int[] array and 
a760: 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65  set both.** Page
a770: 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64  r.aSavepoint and
a780: 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e   Pager.nSavepoin
a790: 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65  t to zero. Close
a7a0: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
a7b0: 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65  .** if it is ope
a7c0: 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  n and the pager 
a7d0: 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  is not in exclus
a7e0: 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ive mode..*/.sta
a7f0: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
a800: 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61  AllSavepoints(Pa
a810: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
a820: 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
a830: 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
a840: 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68  r for looping th
a850: 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53 61 76  rough Pager.aSav
a860: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28  epoint */.  for(
a870: 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d  ii=0; ii<pPager-
a880: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
a890: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  +){.    sqlite3B
a8a0: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
a8b0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
a8c0: 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  ii].pInSavepoint
a8d0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  );.  }.  if( !pP
a8e0: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
a8f0: 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33 49 73  ode || sqlite3Is
a900: 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  MemJournal(pPage
a910: 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20  r->sjfd) ){.    
a920: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
a930: 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20  Pager->sjfd);.  
a940: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
a950: 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
a960: 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  int);.  pPager->
a970: 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  aSavepoint = 0;.
a980: 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70    pPager->nSavep
a990: 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  oint = 0;.  pPag
a9a0: 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b  er->nSubRec = 0;
a9b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
a9c0: 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e  e bit number pgn
a9d0: 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72 53 61  o in the PagerSa
a9e0: 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
a9f0: 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73  oint .** bitvecs
aa00: 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76   of all open sav
aa10: 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20  epoints. Return 
aa20: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
aa30: 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51  cessful.** or SQ
aa40: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20  LITE_NOMEM if a 
aa50: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f  malloc failure o
aa60: 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccurs..*/.static
aa70: 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f   int addToSavepo
aa80: 69 6e 74 42 69 74 76 65 63 73 28 50 61 67 65 72  intBitvecs(Pager
aa90: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
aaa0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20  gno){.  int ii; 
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aac0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
aad0: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  r */.  int rc = 
aae0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
aaf0: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
ab00: 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20  */..  for(ii=0; 
ab10: 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
ab20: 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
ab30: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
ab40: 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61   *p = &pPager->a
ab50: 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20  Savepoint[ii];. 
ab60: 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e     if( pgno<=p->
ab70: 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72  nOrig ){.      r
ab80: 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76  c |= sqlite3Bitv
ab90: 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65  ecSet(p->pInSave
aba0: 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  point, pgno);.  
abb0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
abc0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
abd0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
abe0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
abf0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
ac00: 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  M );.    }.  }. 
ac10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ac20: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
ac30: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
ac40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
ac50: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70  a no-op if the p
ac60: 61 67 65 72 0a 2a 2a 20 69 73 20 69 6e 20 65 78  ager.** is in ex
ac70: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a  clusive mode..**
ac80: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
ac90: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
aca0: 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 69   error state, di
acb0: 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e  scard the conten
acc0: 74 73 20 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61  ts of .** the ca
acd0: 63 68 65 20 61 6e 64 20 72 65 73 65 74 20 74 68  che and reset th
ace0: 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
acf0: 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
ad00: 2e 20 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a  . If there is.**
ad10: 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c   an open journal
ad20: 2d 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20  -file, then the 
ad30: 6e 65 78 74 20 74 69 6d 65 20 61 20 73 68 61 72  next time a shar
ad40: 65 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  ed-lock is obtai
ad50: 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61  ned.** on the pa
ad60: 67 65 72 20 66 69 6c 65 20 28 62 79 20 74 68 69  ger file (by thi
ad70: 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
ad80: 72 6f 63 65 73 73 29 2c 20 69 74 20 77 69 6c 6c  rocess), it will
ad90: 20 62 65 0a 2a 2a 20 74 72 65 61 74 65 64 20 61   be.** treated a
ada0: 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  s a hot-journal 
adb0: 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  and rolled back.
adc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
add0: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
ade0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
adf0: 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
ae00: 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
ae10: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ae30: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
ae40: 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 63  .    /* Always c
ae50: 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lose the journal
ae60: 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70   file when dropp
ae70: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
ae80: 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2a 20 4f 74   lock..    ** Ot
ae90: 68 65 72 77 69 73 65 2c 20 61 6e 6f 74 68 65 72  herwise, another
aea0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
aeb0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65   journal_mode=de
aec0: 6c 65 74 65 20 6d 69 67 68 74 0a 20 20 20 20 2a  lete might.    *
aed0: 2a 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c  * delete the fil
aee0: 65 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  e out from under
aef0: 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   us..    */.    
af00: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
af10: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
af20: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
af30: 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
af40: 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70  nJournal);.    p
af50: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
af60: 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  l = 0;.    relea
af70: 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
af80: 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a  pPager);..    /*
af90: 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
afa0: 75 6e 6c 6f 63 6b 65 64 2c 20 73 6f 6d 65 62 6f  unlocked, somebo
afb0: 64 79 20 65 6c 73 65 20 6d 69 67 68 74 20 63 68  dy else might ch
afc0: 61 6e 67 65 20 69 74 2e 20 54 68 65 0a 20 20 20  ange it. The.   
afd0: 20 2a 2a 20 76 61 6c 75 65 73 20 73 74 6f 72 65   ** values store
afe0: 64 20 69 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  d in Pager.dbSiz
aff0: 65 20 65 74 63 2e 20 6d 69 67 68 74 20 62 65 63  e etc. might bec
b000: 6f 6d 65 20 69 6e 76 61 6c 69 64 20 69 66 0a 20  ome invalid if. 
b010: 20 20 20 2a 2a 20 74 68 69 73 20 68 61 70 70 65     ** this happe
b020: 6e 73 2e 20 54 4f 44 4f 3a 20 52 65 61 6c 6c 79  ns. TODO: Really
b030: 2c 20 74 68 69 73 20 64 6f 65 73 6e 27 74 20 6e  , this doesn't n
b040: 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65  eed to be cleare
b050: 64 0a 20 20 20 20 2a 2a 20 75 6e 74 69 6c 20 74  d.    ** until t
b060: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
b070: 72 20 63 68 65 63 6b 20 66 61 69 6c 73 20 69 6e  r check fails in
b080: 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b   pagerSharedLock
b090: 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ()..    */.    p
b0a0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
b0b0: 69 64 20 3d 20 30 3b 0a 0a 20 20 20 20 72 63 20  id = 0;..    rc 
b0c0: 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  = osUnlock(pPage
b0d0: 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
b0e0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
b0f0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
b100: 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 7d  Code = rc;.    }
b110: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55  .    IOTRACE(("U
b120: 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61  NLOCK %p\n", pPa
b130: 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a 20 49 66  ger))..    /* If
b140: 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69   Pager.errCode i
b150: 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65  s set, the conte
b160: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
b170: 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65   cache cannot be
b180: 0a 20 20 20 20 2a 2a 20 74 72 75 73 74 65 64 2e  .    ** trusted.
b190: 20 4e 6f 77 20 74 68 61 74 20 74 68 65 20 70 61   Now that the pa
b1a0: 67 65 72 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  ger file is unlo
b1b0: 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e  cked, the conten
b1c0: 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ts of the.    **
b1d0: 20 63 61 63 68 65 20 63 61 6e 20 62 65 20 64 69   cache can be di
b1e0: 73 63 61 72 64 65 64 20 61 6e 64 20 74 68 65 20  scarded and the 
b1f0: 65 72 72 6f 72 20 63 6f 64 65 20 73 61 66 65 6c  error code safel
b200: 79 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a  y cleared..    *
b210: 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
b220: 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
b230: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
b240: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
b250: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
b260: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
b270: 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65 72     }.      pager
b280: 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
b290: 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65      }..    pPage
b2a0: 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
b2b0: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ne = 0;.    pPag
b2c0: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
b2d0: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a 7d 0a  R_UNLOCK;.  }.}.
b2e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
b2f0: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 63  tion should be c
b300: 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4f  alled when an IO
b310: 45 52 52 2c 20 43 4f 52 52 55 50 54 20 6f 72 20  ERR, CORRUPT or 
b320: 46 55 4c 4c 20 65 72 72 6f 72 0a 2a 2a 20 6d 61  FULL error.** ma
b330: 79 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 2e  y have occurred.
b340: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
b350: 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
b360: 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 0a 2a   to the pager .*
b370: 2a 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65  * structure, the
b380: 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f   second the erro
b390: 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20  r-code about to 
b3a0: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  be returned by a
b3b0: 20 70 61 67 65 72 20 0a 2a 2a 20 41 50 49 20 66   pager .** API f
b3c0: 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 76 61 6c  unction. The val
b3d0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61  ue returned is a
b3e0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63   copy of the sec
b3f0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a  ond argument .**
b400: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
b410: 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  n. .**.** If the
b420: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
b430: 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   is SQLITE_IOERR
b440: 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  , SQLITE_CORRUPT
b450: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  , or SQLITE_FULL
b460: 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62 65  .** the error be
b470: 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e 74  comes persistent
b480: 2e 20 55 6e 74 69 6c 20 74 68 65 20 70 65 72 73  . Until the pers
b490: 69 73 74 65 6e 20 65 72 72 6f 72 20 69 73 20 63  isten error is c
b4a0: 6c 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62 73 65  leared,.** subse
b4b0: 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73 20  quent API calls 
b4c0: 6f 6e 20 74 68 69 73 20 50 61 67 65 72 20 77 69  on this Pager wi
b4d0: 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72  ll immediately r
b4e0: 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 0a  eturn the same .
b4f0: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  ** error code..*
b500: 2a 0a 2a 2a 20 41 20 70 65 72 73 69 73 74 65 6e  *.** A persisten
b510: 74 20 65 72 72 6f 72 20 69 6e 64 69 63 61 74 65  t error indicate
b520: 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  s that the conte
b530: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
b540: 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f  -cache .** canno
b550: 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 54 68  t be trusted. Th
b560: 69 73 20 73 74 61 74 65 20 63 61 6e 20 62 65 20  is state can be 
b570: 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c  cleared by compl
b580: 65 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67  etely discarding
b590: 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74   .** the content
b5a0: 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63  s of the pager-c
b5b0: 61 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73  ache. If a trans
b5c0: 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76  action was activ
b5d0: 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65  e when.** the pe
b5e0: 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f  rsistent error o
b5f0: 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68  ccurred, then th
b600: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
b610: 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74  al may need.** t
b620: 6f 20 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f  o be replayed to
b630: 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e   restore the con
b640: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74  tents of the dat
b650: 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 69  abase file (as i
b660: 66 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68  f.** it were a h
b670: 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a  ot-journal)..*/.
b680: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
b690: 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50  _error(Pager *pP
b6a0: 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20  ager, int rc){. 
b6b0: 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20   int rc2 = rc & 
b6c0: 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 0a  0xff;.  assert(.
b6d0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
b6e0: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
b6f0: 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50  ULL ||.       pP
b700: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
b710: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20  QLITE_OK ||.    
b720: 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43     (pPager->errC
b730: 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c  ode & 0xff)==SQL
b740: 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20  ITE_IOERR.  );. 
b750: 20 69 66 28 0a 20 20 20 20 72 63 32 3d 3d 53 51   if(.    rc2==SQ
b760: 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20  LITE_FULL ||.   
b770: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   rc2==SQLITE_IOE
b780: 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53  RR ||.    rc2==S
b790: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a 20 20  QLITE_CORRUPT.  
b7a0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
b7b0: 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20  rrCode = rc;.   
b7c0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
b7d0: 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
b7e0: 20 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65   .     && sqlite
b7f0: 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
b800: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
b810: 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  ==0 .    ){.    
b820: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
b830: 72 20 69 73 20 61 6c 72 65 61 64 79 20 75 6e 6c  r is already unl
b840: 6f 63 6b 65 64 2c 20 63 61 6c 6c 20 70 61 67 65  ocked, call page
b850: 72 5f 75 6e 6c 6f 63 6b 28 29 20 6e 6f 77 20 74  r_unlock() now t
b860: 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 72  o.      ** clear
b870: 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
b880: 20 61 6e 64 20 65 6e 73 75 72 65 20 74 68 61 74   and ensure that
b890: 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
b8a0: 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f   is .      ** co
b8b0: 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a  mpletely empty..
b8c0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
b8d0: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
b8e0: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
b8f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b900: 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72  *.** Execute a r
b910: 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61  ollback if a tra
b920: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
b930: 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  ve and unlock th
b940: 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  e .** database f
b950: 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ile. .**.** If t
b960: 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72  he pager has alr
b970: 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65  eady entered the
b980: 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f   error state, do
b990: 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a   not attempt .**
b9a0: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74   the rollback at
b9b0: 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74   this time. Inst
b9c0: 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63  ead, pager_unloc
b9d0: 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54  k() is called. T
b9e0: 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61  he.** call to pa
b9f0: 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c  ger_unlock() wil
ba00: 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e  l discard all in
ba10: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75  -memory pages, u
ba20: 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74  nlock.** the dat
ba30: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 63  abase file and c
ba40: 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73  lear the error s
ba50: 74 61 74 65 2e 20 49 66 20 74 68 69 73 20 6d 65  tate. If this me
ba60: 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 72  ans that.** ther
ba70: 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  e is a hot-journ
ba80: 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  al left in the f
ba90: 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20  ile-system, the 
baa0: 6e 65 78 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  next connection.
bab0: 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73  ** to obtain a s
bac0: 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
bad0: 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d  e pager (which m
bae0: 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20  ay be this one) 
baf0: 77 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20 69 74 20  will.** roll it 
bb00: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
bb10: 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74  he pager has not
bb20: 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
bb30: 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
bb40: 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a  , but an IO or.*
bb50: 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  * malloc error o
bb60: 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72  ccurs during a r
bb70: 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68  ollback, then th
bb80: 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63  is will itself c
bb90: 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67  ause .** the pag
bba0: 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
bbb0: 65 72 72 6f 72 20 73 74 61 74 65 2e 20 57 68 69  error state. Whi
bbc0: 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72  ch will be clear
bbd0: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c  ed by the.** cal
bbe0: 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
bbf0: 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65  k(), as describe
bc00: 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74  d above..*/.stat
bc10: 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
bc20: 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
bc30: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
bc40: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
bc50: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
bc60: 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  && pPager->state
bc70: 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
bc80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
bc90: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
bca0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ();.    sqlite3P
bcb0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61  agerRollback(pPa
bcc0: 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ger);.    sqlite
bcd0: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
bce0: 28 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f  ();.  }.  pager_
bcf0: 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
bd00: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
bd10: 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61  utine ends a tra
bd20: 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e  nsaction. A tran
bd30: 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c  saction is usual
bd40: 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20  ly ended by .** 
bd50: 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20  either a COMMIT 
bd60: 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70  or a ROLLBACK op
bd70: 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f  eration. This ro
bd80: 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c  utine may be cal
bd90: 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f  led .** after ro
bda0: 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d  llback of a hot-
bdb0: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61  journal, or if a
bdc0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
bdd0: 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20  hile opening.** 
bde0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
bdf0: 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
be00: 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e  very first journ
be10: 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a  al-header of a.*
be20: 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  * database trans
be30: 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49  action..** .** I
be40: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
be50: 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6f  n PAGER_SHARED o
be60: 72 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73  r PAGER_UNLOCK s
be70: 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
be80: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
be90: 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
bea0: 6f 70 20 28 72 65 74 75 72 6e 73 20 53 51 4c 49  op (returns SQLI
beb0: 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  TE_OK)..**.** Ot
bec0: 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74  herwise, any act
bed0: 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
bee0: 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  re released..**.
bef0: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
bf00: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20  l file is open, 
bf10: 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61  then it is "fina
bf20: 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a  lized". Once a j
bf30: 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20  ournal .** file 
bf40: 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
bf50: 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  ed it is not pos
bf60: 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20  sible to use it 
bf70: 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a  to roll back a .
bf80: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
bf90: 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63  Nor will it be c
bfa0: 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
bfb0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79  a hot-journal by
bfc0: 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20   this.** or any 
bfd0: 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
bfe0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74  onnection. Exact
bff0: 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c  ly how a journal
c000: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a   is finalized.**
c010: 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
c020: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70  her or not the p
c030: 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
c040: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
c050: 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72  e and.** the cur
c060: 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64  rent journal-mod
c070: 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  e (Pager.journal
c080: 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20  Mode value), as 
c090: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
c0a0: 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45   journalMode==ME
c0b0: 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  MORY.**     Jour
c0c0: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
c0d0: 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c  tor is simply cl
c0e0: 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72  osed. This destr
c0f0: 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69  oys an .**     i
c100: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
c110: 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
c120: 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a  lMode==TRUNCATE.
c130: 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
c140: 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
c150: 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
c160: 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  n size..**.**   
c170: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
c180: 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20  SIST.**     The 
c190: 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f  first 28 bytes o
c1a0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
c1b0: 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54  le are zeroed. T
c1c0: 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a  his invalidates.
c1d0: 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74  **     the first
c1e0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
c1f0: 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64  in the file, and
c200: 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72   hence the entir
c210: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
c220: 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69   file. An invali
c230: 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  d journal file c
c240: 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20  annot be rolled 
c250: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  back..**.**   jo
c260: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54  urnalMode==DELET
c270: 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75  E.**     The jou
c280: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  rnal file is clo
c290: 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20  sed and deleted 
c2a0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
c2b0: 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20  elete()..**.**  
c2c0: 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20     If the pager 
c2d0: 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
c2e0: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
c2f0: 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e  is method of fin
c300: 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74  alizing.**     t
c310: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c320: 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49  is never used. I
c330: 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a  nstead, if the j
c340: 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a  ournalMode is.**
c350: 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20       DELETE and 
c360: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
c370: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
c380: 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72  the method descr
c390: 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20  ibed under.**   
c3a0: 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
c3b0: 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69  ERSIST is used i
c3c0: 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66  nstead..**.** Af
c3d0: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
c3e0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 69 66  is finalized, if
c3f0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d   running in non-
c400: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
c410: 74 68 65 0a 2a 2a 20 70 61 67 65 72 20 6d 6f 76  the.** pager mov
c420: 65 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  es to PAGER_SHAR
c430: 45 44 20 73 74 61 74 65 20 28 61 6e 64 20 64 6f  ED state (and do
c440: 77 6e 67 72 61 64 65 73 20 74 68 65 20 6c 6f 63  wngrades the loc
c450: 6b 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  k on the.** data
c460: 62 61 73 65 20 66 69 6c 65 20 61 63 63 6f 72 64  base file accord
c470: 69 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ingly)..**.** If
c480: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
c490: 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
c4a0: 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 73 20 69  ve mode and is i
c4b0: 6e 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 73  n PAGER_SYNCED s
c4c0: 74 61 74 65 2c 0a 2a 2a 20 69 74 20 6d 6f 76 65  tate,.** it move
c4d0: 73 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55  s to PAGER_EXCLU
c4e0: 53 49 56 45 2e 20 4e 6f 20 6c 6f 63 6b 73 20 61  SIVE. No locks a
c4f0: 72 65 20 64 6f 77 6e 67 72 61 64 65 64 20 77 68  re downgraded wh
c500: 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 0a 2a 2a  en running in.**
c510: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
c520: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
c530: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
c540: 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  no error occurs.
c550: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
c560: 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e  urs during.** an
c570: 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72  y of the IO oper
c580: 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69  ations to finali
c590: 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
c5a0: 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68  ile or unlock th
c5b0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68  e.** database th
c5c0: 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
c5d0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
c5e0: 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66   to the user. If
c5f0: 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69   the .** operati
c600: 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  on to finalize t
c610: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c620: 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20  fails, then the 
c630: 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72  code still.** tr
c640: 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ies to unlock th
c650: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
c660: 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  if not in exclus
c670: 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  ive mode. If the
c680: 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61  .** unlock opera
c690: 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65  tion fails as we
c6a0: 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ll, then the fir
c6b0: 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  st error code re
c6c0: 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  lated.** to the 
c6d0: 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f  first error enco
c6e0: 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75  untered (the jou
c6f0: 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f  rnal finalizatio
c700: 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74  n one) is.** ret
c710: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
c720: 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74   int pager_end_t
c730: 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
c740: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61   *pPager, int ha
c750: 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  sMaster){.  int 
c760: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
c770: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
c780: 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  de from journal 
c790: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65  finalization ope
c7a0: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
c7b0: 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
c7c0: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
c7d0: 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20  de from db file 
c7e0: 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
c7f0: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65   */..  if( pPage
c800: 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
c810: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
c820: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c830: 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 41 6c  .  }.  releaseAl
c840: 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67  lSavepoints(pPag
c850: 65 72 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  er);..  assert( 
c860: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
c870: 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  fd) || pPager->p
c880: 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
c890: 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
c8a0: 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 0a 20 20  ger->jfd) ){..  
c8b0: 20 20 2f 2a 20 54 4f 44 4f 3a 20 54 68 65 72 65    /* TODO: There
c8c0: 27 73 20 61 20 70 72 6f 62 6c 65 6d 20 68 65 72  's a problem her
c8d0: 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 66  e if a journal-f
c8e0: 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 69  ile was opened i
c8f0: 6e 20 4d 45 4d 4f 52 59 0a 20 20 20 20 2a 2a 20  n MEMORY.    ** 
c900: 6d 6f 64 65 20 61 6e 64 20 74 68 65 6e 20 74 68  mode and then th
c910: 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69  e journal-mode i
c920: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 52 55  s changed to TRU
c930: 4e 43 41 54 45 20 6f 72 20 50 45 52 53 49 53 54  NCATE or PERSIST
c940: 0a 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74  .    ** during t
c950: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
c960: 54 68 69 73 20 63 6f 64 65 20 73 68 6f 75 6c 64  This code should
c970: 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61   be changed to a
c980: 73 73 75 6d 65 0a 20 20 20 20 2a 2a 20 74 68 61  ssume.    ** tha
c990: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f  t the journal mo
c9a0: 64 65 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67  de has not chang
c9b0: 65 64 20 73 69 6e 63 65 20 74 68 65 20 74 72 61  ed since the tra
c9c0: 6e 73 61 63 74 69 6f 6e 20 77 61 73 0a 20 20 20  nsaction was.   
c9d0: 20 2a 2a 20 73 74 61 72 74 65 64 2e 20 41 6e 64   ** started. And
c9e0: 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
c9f0: 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 29 20 66  rJournalMode() f
ca00: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  unction should b
ca10: 65 0a 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 64  e.    ** changed
ca20: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
ca30: 61 74 20 74 68 69 73 20 69 73 20 74 68 65 20 63  at this is the c
ca40: 61 73 65 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a  ase too..    */.
ca50: 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65  .    /* Finalize
ca60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
ca70: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  e. */.    if( pP
ca80: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
ca90: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
caa0: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
cab0: 20 20 20 20 20 69 6e 74 20 69 73 4d 65 6d 6f 72       int isMemor
cac0: 79 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  yJournal = sqlit
cad0: 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
cae0: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
caf0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
cb00: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
cb10: 20 20 20 20 20 20 69 66 28 20 21 69 73 4d 65 6d        if( !isMem
cb20: 6f 72 79 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  oryJournal ){.  
cb30: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
cb40: 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
cb50: 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
cb60: 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
cb70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
cb80: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
cb90: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
cba0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
cbb0: 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66  CATE ){.      if
cbc0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
cbd0: 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lOff==0 ){.     
cbe0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
cbf0: 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
cc00: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
cc10: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
cc20: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a  Pager->jfd, 0);.
cc30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
cc40: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
cc50: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
cc60: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
cc70: 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ed = 0;.    }els
cc80: 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78  e if( pPager->ex
cc90: 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20  clusiveMode .   
cca0: 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
ccb0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
ccc0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
ccd0: 49 53 54 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  IST.    ){.     
cce0: 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61   rc = zeroJourna
ccf0: 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61 73  lHdr(pPager, has
cd00: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70  Master);.      p
cd10: 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
cd20: 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 70 50  r, rc);.      pP
cd30: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
cd40: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
cd50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
cd60: 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ed = 0;.    }els
cd70: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
cd80: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
cd90: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
cda0: 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 7c  NALMODE_DELETE |
cdb0: 7c 20 72 63 20 29 3b 0a 20 20 20 20 20 20 73 71  | rc );.      sq
cdc0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
cdd0: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
cde0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
cdf0: 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  OK && !pPager->t
ce00: 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
ce10: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
ce20: 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
ce30: 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
ce40: 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
ce50: 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65    }.    }..#ifde
ce60: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
ce70: 41 47 45 53 0a 20 20 20 20 73 71 6c 69 74 65 33  AGES.    sqlite3
ce80: 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72  PcacheIterateDir
ce90: 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ty(pPager->pPCac
cea0: 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61  he, pager_set_pa
ceb0: 67 65 68 61 73 68 29 3b 0a 23 65 6e 64 69 66 0a  gehash);.#endif.
cec0: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
ced0: 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65  heCleanAll(pPage
cee0: 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20  r->pPCache);.   
cef0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
cf00: 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
cf10: 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70  nJournal);.    p
cf20: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
cf30: 6c 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  l = 0;.    pPage
cf40: 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d  r->nRec = 0;.  }
cf50: 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
cf60: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
cf70: 7b 0a 20 20 20 20 72 63 32 20 3d 20 6f 73 55 6e  {.    rc2 = osUn
cf80: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
cf90: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
cfa0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
cfb0: 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
cfc0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
cfd0: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30  ngeCountDone = 0
cfe0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
cff0: 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
d000: 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20  ER_SYNCED ){.   
d010: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
d020: 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
d030: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
d040: 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
d050: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
d060: 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  c = 0;.  pPager-
d070: 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b  >dbModified = 0;
d080: 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20  ..  /* TODO: Is 
d090: 74 68 69 73 20 6f 70 74 69 6d 61 6c 3f 20 57 68  this optimal? Wh
d0a0: 79 20 69 73 20 74 68 65 20 64 62 20 73 69 7a 65  y is the db size
d0b0: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 68 65 72   invalidated her
d0c0: 65 20 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68 65  e .  ** when the
d0d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
d0e0: 73 20 6e 6f 74 20 75 6e 6c 6f 63 6b 65 64 3f 20  s not unlocked? 
d0f0: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4f  */.  pPager->dbO
d100: 72 69 67 53 69 7a 65 20 3d 20 30 3b 0a 20 20 73  rigSize = 0;.  s
d110: 71 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e  qlite3PcacheTrun
d120: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43  cate(pPager->pPC
d130: 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62  ache, pPager->db
d140: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 21 4d 45  Size);.  if( !ME
d150: 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65  MDB ){.    pPage
d160: 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d  r->dbSizeValid =
d170: 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   0;.  }..  retur
d180: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
d190: 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  ?rc2:rc);.}../*.
d1a0: 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61  ** Parameter aDa
d1b0: 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  ta must point to
d1c0: 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61   a buffer of pPa
d1d0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
d1e0: 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20  tes.** of data. 
d1f0: 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75  Compute and retu
d200: 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61  rn a checksum ba
d210: 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74  sed ont the cont
d220: 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  ents of the .** 
d230: 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64  page of data and
d240: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
d250: 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b  ue of pPager->ck
d260: 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  sumInit..**.** T
d270: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61  his is not a rea
d280: 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69  l checksum. It i
d290: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68  s really just th
d2a0: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a  e sum of the .**
d2b0: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20   random initial 
d2c0: 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63  value (pPager->c
d2d0: 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76  ksumInit) and ev
d2e0: 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a  ery 200th byte.*
d2f0: 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  * of the page da
d300: 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74  ta, starting wit
d310: 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70  h byte offset (p
d320: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25  Pager->pageSize%
d330: 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79  200)..** Each by
d340: 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  te is interprete
d350: 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e  d as an 8-bit un
d360: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a  signed integer..
d370: 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74  **.** Changing t
d380: 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20  he formula used 
d390: 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20  to compute this 
d3a0: 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73  checksum results
d3b0: 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70   in an.** incomp
d3c0: 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66  atible journal f
d3d0: 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  ile format..**.*
d3e0: 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72  * If journal cor
d3f0: 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64  ruption occurs d
d400: 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61  ue to a power fa
d410: 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20  ilure, the most 
d420: 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61  likely .** scena
d430: 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20  rio is that one 
d440: 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72  end or the other
d450: 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77   of the record w
d460: 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20  ill be changed. 
d470: 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c  .** It is much l
d480: 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20  ess likely that 
d490: 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20  the two ends of 
d4a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
d4b0: 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f  rd will be.** co
d4c0: 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69  rrect and the mi
d4d0: 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e  ddle be corrupt.
d4e0: 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68    Thus, this "ch
d4f0: 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a  ecksum" scheme,.
d500: 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61  ** though fast a
d510: 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68  nd simple, catch
d520: 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69  es the mostly li
d530: 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72  kely kind of cor
d540: 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
d550: 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
d560: 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
d570: 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74  , const u8 *aDat
d580: 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  a){.  u32 cksum 
d590: 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
d5a0: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nit;         /* 
d5b0: 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74  Checksum value t
d5c0: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
d5d0: 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
d5e0: 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20  geSize-200;     
d5f0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
d600: 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28  nter */.  while(
d610: 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75   i>0 ){.    cksu
d620: 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20  m += aData[i];. 
d630: 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d     i -= 200;.  }
d640: 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
d650: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
d660: 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f   single page fro
d670: 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75  m either the jou
d680: 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73  rnal file (if is
d690: 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a  MainJrnl==1) or.
d6a0: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ** from the sub-
d6b0: 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61  journal (if isMa
d6c0: 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70  inJrnl==0) and p
d6d0: 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70 61 67  layback that pag
d6e0: 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62  e..** The page b
d6f0: 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20  egins at offset 
d700: 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68  *pOffset into th
d710: 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66  e file. The *pOf
d720: 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73  fset.** value is
d730: 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68   increased to th
d740: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
d750: 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
d760: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
d770: 68 65 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 66 6c  he isMainJrnl fl
d780: 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  ag is true if th
d790: 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20 72  is is the main r
d7a0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
d7b0: 61 6e 64 0a 2a 2a 20 66 61 6c 73 65 20 66 6f 72  and.** false for
d7c0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
d7d0: 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 69  ournal.  The mai
d7e0: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  n rollback journ
d7f0: 61 6c 20 75 73 65 73 0a 2a 2a 20 63 68 65 63 6b  al uses.** check
d800: 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65  sums - the state
d810: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65  ment journal doe
d820: 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  s not..**.** If 
d830: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
d840: 6f 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f  of the page reco
d850: 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  rd read from the
d860: 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
d870: 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65  ile.** is greate
d880: 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
d890: 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  nt value of Page
d8a0: 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70  r.dbSize, then p
d8b0: 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b  layback is.** sk
d8c0: 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45  ipped and SQLITE
d8d0: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
d8e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20  .**.** If pDone 
d8f0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
d900: 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f 72 64  n it is a record
d910: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68   of pages that h
d920: 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62  ave already.** b
d930: 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e  een played back.
d940: 20 20 49 66 20 74 68 65 20 70 61 67 65 20 61 74    If the page at
d950: 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c   *pOffset has al
d960: 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65  ready been playe
d970: 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68  d back.** (if th
d980: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
d990: 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74  pDone bit is set
d9a0: 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20  ) then skip the 
d9b0: 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b  playback..** Mak
d9c0: 65 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65  e sure the pDone
d9d0: 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69   bit correspondi
d9e0: 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73  ng to the *pOffs
d9f0: 65 74 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a  et page is set.*
da00: 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72  * prior to retur
da10: 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ning..**.** If t
da20: 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 69  he page record i
da30: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72  s successfully r
da40: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ead from the (su
da50: 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  b-)journal file.
da60: 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61  ** and played ba
da70: 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  ck, then SQLITE_
da80: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
da90: 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
daa0: 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72  ccurs.** while r
dab0: 65 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72  eading the recor
dac0: 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
dad0: 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72  )journal file or
dae0: 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a   while writing.*
daf0: 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
db00: 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65  e file, then the
db10: 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
db20: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64  s returned. If d
db30: 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73  ata.** is succes
db40: 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  sfully read from
db50: 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
db60: 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70 65  al file but appe
db70: 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72  ars to be.** cor
db80: 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
db90: 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
dba0: 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65   Data is conside
dbb0: 72 65 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e  red corrupted in
dbc0: 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74  .** two circumst
dbd0: 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20  ances:.** .**   
dbe0: 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
dbf0: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69  page-number is i
dc00: 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47  llegal (0 or PAG
dc10: 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a  ER_MJ_PGNO), or.
dc20: 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65  **   * If the re
dc30: 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f  cord is being ro
dc40: 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  lled back from t
dc50: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
dc60: 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20  file.**     and 
dc70: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65  the checksum fie
dc80: 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ld does not matc
dc90: 68 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e  h the record con
dca0: 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74  tent..**.** Neit
dcb0: 68 65 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f  her of these two
dcc0: 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70   scenarios are p
dcd0: 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61  ossible during a
dce0: 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
dcf0: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
dd00: 69 73 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e  is is a savepoin
dd10: 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  t rollback, then
dd20: 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65   memory may have
dd30: 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c   to be dynamical
dd40: 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  ly.** allocated 
dd50: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
dd60: 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
dd70: 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c   case and an all
dd80: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a  ocation fails,.*
dd90: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
dda0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
ddb0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
ddc0: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
ddd0: 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
dde0: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
ddf0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
de00: 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63  being played bac
de10: 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69  k */.  int isMai
de20: 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20  nJrnl,          
de30: 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69       /* 1 -> mai
de40: 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20  n journal. 0 -> 
de50: 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  sub-journal. */.
de60: 20 20 69 6e 74 20 69 73 55 6e 73 79 6e 63 2c 20    int isUnsync, 
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de80: 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61 64 69  /* True if readi
de90: 6e 67 20 66 72 6f 6d 20 75 6e 73 79 6e 63 65 64  ng from unsynced
dea0: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f   main journal */
deb0: 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c  .  i64 *pOffset,
dec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ded0: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65   /* Offset of re
dee0: 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b  cord to playback
def0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65   */.  int isSave
df00: 70 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  pnt,            
df10: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
df20: 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
df30: 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63  back */.  Bitvec
df40: 20 2a 70 44 6f 6e 65 20 20 20 20 20 20 20 20 20   *pDone         
df50: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65          /* Bitve
df60: 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61  c of pages alrea
df70: 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a  dy played back *
df80: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
df90: 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20   PgHdr *pPg;    
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dfb0: 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61  * An existing pa
dfc0: 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  ge in the cache 
dfd0: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dff0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
e000: 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20  umber of a page 
e010: 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
e020: 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20  u32 cksum;      
e030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e040: 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66   Checksum used f
e050: 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  or sanity checki
e060: 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74  ng */.  u8 *aDat
e070: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
e080: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
e090: 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74  ry storage for t
e0a0: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c  he page */.  sql
e0b0: 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20  ite3_file *jfd; 
e0c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
e0d0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
e0e0: 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  r for the journa
e0f0: 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73  l file */..  ass
e100: 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c  ert( (isMainJrnl
e110: 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  &~1)==0 );      
e120: 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73  /* isMainJrnl is
e130: 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73   0 or 1 */.  ass
e140: 65 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26  ert( (isSavepnt&
e150: 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  ~1)==0 );       
e160: 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20  /* isSavepnt is 
e170: 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
e180: 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c  rt( isMainJrnl |
e190: 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f  | pDone );     /
e1a0: 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75  * pDone always u
e1b0: 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e  sed on sub-journ
e1c0: 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  als */.  assert(
e1d0: 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44   isSavepnt || pD
e1e0: 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70  one==0 );   /* p
e1f0: 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20  Done never used 
e200: 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74  on non-savepoint
e210: 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 28   */..  aData = (
e220: 75 38 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70  u8*)pPager->pTmp
e230: 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28  Space;.  assert(
e240: 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20 20   aData );       
e250: 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
e260: 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  e must have alre
e270: 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
e280: 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64  ed */..  /* Read
e290: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
e2a0: 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66   and page data f
e2b0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
e2c0: 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20  or sub-journal. 
e2d0: 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e   ** file. Return
e2e0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74   an error code t
e2f0: 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20  o the caller if 
e300: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
e310: 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d  rs..  */.  jfd =
e320: 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50   isMainJrnl ? pP
e330: 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67  ager->jfd : pPag
e340: 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d  er->sjfd;.  rc =
e350: 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
e360: 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f   *pOffset, &pgno
e370: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
e380: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
e390: 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
e3a0: 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 61 44  e3OsRead(jfd, aD
e3b0: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
e3c0: 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74  eSize, (*pOffset
e3d0: 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  )+4);.  if( rc!=
e3e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
e3f0: 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65  rn rc;.  *pOffse
e400: 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  t += pPager->pag
e410: 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61  eSize + 4 + isMa
e420: 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20  inJrnl*4;..  /* 
e430: 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
e440: 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68  on the page.  Th
e450: 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72  is is more impor
e460: 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67  tant that I orig
e470: 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75  inally.  ** thou
e480: 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72  ght.  If a power
e490: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
e4a0: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
e4b0: 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  l is being writt
e4c0: 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c  en,.  ** it coul
e4d0: 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20  d cause invalid 
e4e0: 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74  data to be writt
e4f0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
e500: 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  nal.  We need to
e510: 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69  .  ** detect thi
e520: 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28  s invalid data (
e530: 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62  with high probab
e540: 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72  ility) and ignor
e550: 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  e it..  */.  if(
e560: 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f   pgno==0 || pgno
e570: 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
e580: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61  pPager) ){.    a
e590: 73 73 65 72 74 28 20 21 69 73 53 61 76 65 70 6e  ssert( !isSavepn
e5a0: 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  t );.    return 
e5b0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
e5c0: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e  .  if( pgno>(Pgn
e5d0: 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  o)pPager->dbSize
e5e0: 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65   || sqlite3Bitve
e5f0: 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e  cTest(pDone, pgn
e600: 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  o) ){.    return
e610: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
e620: 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
e630: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61   ){.    rc = rea
e640: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70  d32bits(jfd, (*p
e650: 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75  Offset)-4, &cksu
e660: 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  m);.    if( rc )
e670: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
e680: 69 66 28 20 21 69 73 53 61 76 65 70 6e 74 20 26  if( !isSavepnt &
e690: 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  & pager_cksum(pP
e6a0: 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63 6b  ager, aData)!=ck
e6b0: 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sum ){.      ret
e6c0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
e6d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
e6e0: 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d  ( pDone && (rc =
e6f0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
e700: 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21  t(pDone, pgno))!
e710: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e720: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
e730: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
e740: 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
e750: 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61  _RESERVED || pPa
e760: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
e770: 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a  R_EXCLUSIVE );..
e780: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
e790: 72 20 69 73 20 69 6e 20 52 45 53 45 52 56 45 44  r is in RESERVED
e7a0: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65   state, then the
e7b0: 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70  re must be a cop
e7c0: 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70  y of this.  ** p
e7d0: 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72  age in the pager
e7e0: 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20   cache. In this 
e7f0: 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65  case just update
e800: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
e810: 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64  ,.  ** not the d
e820: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
e830: 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d  e page is left m
e840: 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74  arked dirty in t
e850: 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20  his case..  **. 
e860: 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e   ** An exception
e870: 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75   to the above ru
e880: 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74 61 62  le: If the datab
e890: 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e  ase is in no-syn
e8a0: 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20  c mode.  ** and 
e8b0: 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20  a page is moved 
e8c0: 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d  during an increm
e8d0: 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65  ental vacuum the
e8e0: 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20  n the page may. 
e8f0: 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68   ** not be in th
e900: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c  e pager cache. L
e910: 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f  ater: if a mallo
e920: 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20  c() or IO error 
e930: 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69  occurs.  ** duri
e940: 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20  ng a Movepage() 
e950: 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70  call, then the p
e960: 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69  age may not be i
e970: 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a  n the cache.  **
e980: 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20   either. So the 
e990: 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69  condition descri
e9a0: 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65  bed in the above
e9b0: 20 70 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f   paragraph is no
e9c0: 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61  t.  ** assert()a
e9d0: 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ble..  **.  ** I
e9e0: 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73  f in EXCLUSIVE s
e9f0: 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70  tate, then we up
ea00: 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
ea10: 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74  ache if it exist
ea20: 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d  s.  ** and the m
ea30: 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ain file. The pa
ea40: 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65  ge is then marke
ea50: 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a  d not dirty..  *
ea60: 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31  *.  ** Ticket #1
ea70: 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d  171:  The statem
ea80: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  ent journal migh
ea90: 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63  t contain page c
eaa0: 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20  ontent that is. 
eab0: 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72   ** different fr
eac0: 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  om the page cont
ead0: 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ent at the start
eae0: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
eaf0: 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f  ion..  ** This o
eb00: 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67  ccurs when a pag
eb10: 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69  e is changed pri
eb20: 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
eb30: 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20  of a statement. 
eb40: 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64   ** then changed
eb50: 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
eb60: 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68  e statement.  Wh
eb70: 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
eb80: 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74  such a.  ** stat
eb90: 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f  ement we must no
eba0: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f  t write to the o
ebb0: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
ebc0: 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a   unless we know.
ebd0: 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e    ** for certain
ebe0: 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70   that original p
ebf0: 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
ec00: 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65   synced into the
ec10: 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
ec20: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74   ** journal.  Ot
ec30: 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72  herwise, a power
ec40: 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76   loss might leav
ec50: 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20  e modified data 
ec60: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  in the.  ** data
ec70: 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75  base file withou
ec80: 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  t an entry in th
ec90: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
eca0: 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a  al that can.  **
ecb0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
ecc0: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
ecd0: 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f  ginal form.  Two
ece0: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74   conditions must
ecf0: 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66   be.  ** met bef
ed00: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ore writing to t
ed10: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
ed20: 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62  s. (1) the datab
ed30: 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ase must be.  **
ed40: 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65   locked.  (2) we
ed50: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
ed60: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
ed70: 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79  tent is fully sy
ed80: 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65  nced.  ** in the
ed90: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69   main journal ei
eda0: 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65  ther because the
edb0: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
edc0: 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20  cache or else.  
edd0: 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d  ** the page is m
ede0: 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e  arked as needSyn
edf0: 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  c==0..  **.  ** 
ee00: 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65  2008-04-14:  Whe
ee10: 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  n attempting to 
ee20: 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74  vacuum a corrupt
ee30: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
ee40: 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69  it.  ** is possi
ee50: 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74  ble to fail a st
ee60: 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74  atement on a dat
ee70: 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73 20  abase that does 
ee80: 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20  not yet exist.. 
ee90: 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d   ** Do not attem
eea0: 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20 64  pt to write if d
eeb0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
eec0: 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e   never been open
eed0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  ed..  */.  pPg =
eee0: 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
eef0: 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61  ager, pgno);.  a
ef00: 73 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d  ssert( pPg || !M
ef10: 45 4d 44 42 20 29 3b 0a 20 20 50 41 47 45 52 54  EMDB );.  PAGERT
ef20: 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20  RACE(("PLAYBACK 
ef30: 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
ef40: 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20  %08x) %s\n",.   
ef50: 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
ef60: 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
ef70: 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  o, pager_datahas
ef80: 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  h(pPager->pageSi
ef90: 7a 65 2c 20 61 44 61 74 61 29 2c 0a 20 20 20 20  ze, aData),.    
efa0: 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d 61             (isMa
efb0: 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75  inJrnl?"main-jou
efc0: 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e  rnal":"sub-journ
efd0: 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28  al").  ));.  if(
efe0: 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e   (pPager->state>
eff0: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
f000: 29 0a 20 20 20 26 26 20 28 70 50 67 3d 3d 30 20  ).   && (pPg==0 
f010: 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67  || 0==(pPg->flag
f020: 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
f030: 43 29 29 0a 20 20 20 26 26 20 69 73 4f 70 65 6e  C)).   && isOpen
f040: 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20  (pPager->fd).   
f050: 26 26 20 21 69 73 55 6e 73 79 6e 63 0a 20 20 29  && !isUnsync.  )
f060: 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d  {.    i64 ofst =
f070: 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
f080: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
f090: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
f0a0: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
f0b0: 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67  >fd, aData, pPag
f0c0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
f0d0: 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  st);.    if( pgn
f0e0: 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
f0f0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Size ){.      pP
f100: 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
f110: 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20   = pgno;.    }. 
f120: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
f130: 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20  Backup ){.      
f140: 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61  CODEC1(pPager, a
f150: 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72  Data, pgno, 3, r
f160: 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  c=SQLITE_NOMEM);
f170: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
f180: 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
f190: 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
f1a0: 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  , aData);.      
f1b0: 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61  CODEC1(pPager, a
f1c0: 44 61 74 61 2c 20 70 67 6e 6f 2c 20 30 2c 20 72  Data, pgno, 0, r
f1d0: 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  c=SQLITE_NOMEM);
f1e0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
f1f0: 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26  f( !isMainJrnl &
f200: 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  & pPg==0 ){.    
f210: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
f220: 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73 61  rollback of a sa
f230: 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74 61  vepoint and data
f240: 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65 6e   was not written
f250: 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   to.    ** the d
f260: 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20  atabase and the 
f270: 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d  page is not in-m
f280: 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73 20  emory, there is 
f290: 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20  a potential.    
f2a0: 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e  ** problem. When
f2b0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 65 78   the page is nex
f2c0: 74 20 66 65 74 63 68 65 64 20 62 79 20 74 68 65  t fetched by the
f2d0: 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20 69   b-tree layer, i
f2e0: 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  t .    ** will b
f2f0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
f300: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
f310: 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20  hich may or may 
f320: 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20 63  not be .    ** c
f330: 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a  urrent. .    **.
f340: 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65      ** There are
f350: 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66   a couple of dif
f360: 66 65 72 65 6e 74 20 77 61 79 73 20 74 68 69 73  ferent ways this
f370: 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c   can happen. All
f380: 20 61 72 65 20 71 75 69 74 65 0a 20 20 20 20 2a   are quite.    *
f390: 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e 20  * obscure. When 
f3a0: 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68  running in synch
f3b0: 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69  ronous mode, thi
f3c0: 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
f3d0: 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65  n .    ** if the
f3e0: 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65 20   page is on the 
f3f0: 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68 65  free-list at the
f400: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
f410: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a  ansaction, then.
f420: 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64      ** populated
f430: 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73 69  , then moved usi
f440: 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  ng sqlite3PagerM
f450: 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20 2a  ovepage()..    *
f460: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c  *.    ** The sol
f470: 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64 20  ution is to add 
f480: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
f490: 65 20 74 6f 20 74 68 65 20 63 61 63 68 65 20 63  e to the cache c
f4a0: 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a  ontaining.    **
f4b0: 20 74 68 65 20 64 61 74 61 20 6a 75 73 74 20 72   the data just r
f4c0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ead from the sub
f4d0: 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74  -journal. Mark t
f4e0: 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
f4f0: 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20   .    ** and if 
f500: 74 68 65 20 70 61 67 65 72 20 72 65 71 75 69 72  the pager requir
f510: 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  es a journal-syn
f520: 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68 65  c, then mark the
f530: 20 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a 2a   page as .    **
f540: 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f 75   requiring a jou
f550: 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65  rnal-sync before
f560: 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e 0a   it is written..
f570: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
f580: 74 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b 0a  t( isSavepnt );.
f590: 20 20 20 20 69 66 28 20 28 72 63 20 3d 20 73 71      if( (rc = sq
f5a0: 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
f5b0: 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  e(pPager, pgno, 
f5c0: 26 70 50 67 2c 20 31 29 29 21 3d 53 51 4c 49 54  &pPg, 1))!=SQLIT
f5d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
f5e0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
f5f0: 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d     pPg->flags &=
f600: 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41   ~PGHDR_NEED_REA
f610: 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  D;.    sqlite3Pc
f620: 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
f630: 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  g);.  }.  if( pP
f640: 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70  g ){.    /* No p
f650: 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20  age should ever 
f660: 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f  be explicitly ro
f670: 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69  lled back that i
f680: 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74  s in use, except
f690: 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  .    ** for page
f6a0: 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64   1 which is held
f6b0: 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72   in use in order
f6c0: 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63   to keep the loc
f6d0: 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
f6e0: 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e  database active.
f6f0: 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20   However such a 
f700: 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c  page may be roll
f710: 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
f720: 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e  ult.    ** of an
f730: 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20   internal error 
f740: 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20  resulting in an 
f750: 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74  automatic call t
f760: 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
f770: 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e  PagerRollback().
f780: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64  .    */.    void
f790: 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61   *pData;.    pDa
f7a0: 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
f7b0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74  .    memcpy(pDat
f7c0: 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72  a, aData, pPager
f7d0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
f7e0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65   if( pPager->xRe
f7f0: 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  initer ){.      
f800: 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
f810: 72 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  r(pPg);.    }.  
f820: 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
f830: 20 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20   && (!isSavepnt 
f840: 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61  || *pOffset<=pPa
f850: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
f860: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
f870: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
f880: 74 68 69 73 20 70 61 67 65 20 77 65 72 65 20 6a  this page were j
f890: 75 73 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f  ust restored fro
f8a0: 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20  m the main .    
f8b0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
f8c0: 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74  e, then its cont
f8d0: 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20 74  ent must be as t
f8e0: 68 65 79 20 77 65 72 65 20 77 68 65 6e 20 74 68  hey were when th
f8f0: 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  e .      ** tran
f900: 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73  saction was firs
f910: 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69  t opened. In thi
f920: 73 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61  s case we can ma
f930: 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  rk the page.    
f940: 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73    ** as clean, s
f950: 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20  ince there will 
f960: 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72  be no need to wr
f970: 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68  ite it out to th
f980: 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
f990: 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e    ** There is on
f9a0: 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74  e exception to t
f9b0: 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74 68 65  his rule. If the
f9c0: 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 72   page is being r
f9d0: 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  olled.      ** b
f9e0: 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66 20 61  ack as part of a
f9f0: 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72 20 73   savepoint (or s
fa00: 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62 61  tatement) rollba
fa10: 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20 20  ck from an .    
fa20: 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70 6f    ** unsynced po
fa30: 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61 69  rtion of the mai
fa40: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  n journal file, 
fa50: 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 73  then it is not s
fa60: 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  afe.      ** to 
fa70: 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
fa80: 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69 73 20   clean. This is 
fa90: 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e 67 20  because marking 
faa0: 74 68 65 20 70 61 67 65 20 61 73 0a 20 20 20 20  the page as.    
fab0: 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c 20    ** clean will 
fac0: 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f  clear the PGHDR_
fad0: 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e 20  NEED_SYNC flag. 
fae0: 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 20 69  Since the page i
faf0: 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61  s.      ** alrea
fb00: 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  dy in the journa
fb10: 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64 65 64  l file (recorded
fb20: 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75   in Pager.pInJou
fb30: 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20 20 20  rnal) and.      
fb40: 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ** the PGHDR_NEE
fb50: 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20 63  D_SYNC flag is c
fb60: 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65 20 70  leared, if the p
fb70: 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 74  age is written t
fb80: 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e  o.      ** again
fb90: 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61   within this tra
fba0: 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77 69 6c  nsaction, it wil
fbb0: 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  l be marked as d
fbc0: 69 72 74 79 20 62 75 74 0a 20 20 20 20 20 20 2a  irty but.      *
fbd0: 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  * the PGHDR_NEED
fbe0: 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c 20  _SYNC flag will 
fbf0: 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74 20 63  not be set. It c
fc00: 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e 74  ould then potent
fc10: 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 62  ially.      ** b
fc20: 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 69 6e  e written out in
fc30: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
fc40: 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74 73 20  file before its 
fc50: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20  journal file.   
fc60: 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73     ** segment is
fc70: 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20 63 72   synced. If a cr
fc80: 61 73 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ash occurs durin
fc90: 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  g or following t
fca0: 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64 61  his,.      ** da
fcb0: 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
fcc0: 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20 20  n may ensue..   
fcd0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
fce0: 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
fcf0: 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 23  an(pPg);.    }.#
fd00: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
fd10: 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67  CK_PAGES.    pPg
fd20: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
fd30: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
fd40: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20  ;.#endif.    /* 
fd50: 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65  If this was page
fd60: 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65   1, then restore
fd70: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
fd80: 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a  ger.dbFileVers..
fd90: 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62      ** Do this b
fda0: 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69  efore any decodi
fdb0: 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ng. */.    if( p
fdc0: 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
fdd0: 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
fde0: 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75  dbFileVers, &((u
fdf0: 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69  8*)pData)[24],si
fe00: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
fe10: 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
fe20: 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20  ..    /* Decode 
fe30: 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65  the page just re
fe40: 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a  ad from disk */.
fe50: 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65      CODEC1(pPage
fe60: 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
fe70: 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
fe80: 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 73 71  E_NOMEM);.    sq
fe90: 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
fea0: 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72  se(pPg);.  }.  r
feb0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
fec0: 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
fed0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
fee0: 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53  ITE_COVERAGE_TES
fef0: 54 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  T)./*.** This ro
ff00: 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 61 68 65 61  utine looks ahea
ff10: 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  d into the main 
ff20: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64  journal file and
ff30: 20 64 65 74 65 72 6d 69 6e 65 73 0a 2a 2a 20 77   determines.** w
ff40: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
ff50: 65 20 6e 65 78 74 20 72 65 63 6f 72 64 20 28 74  e next record (t
ff60: 68 65 20 72 65 63 6f 72 64 20 74 68 61 74 20 62  he record that b
ff70: 65 67 69 6e 73 20 61 74 20 66 69 6c 65 0a 2a 2a  egins at file.**
ff80: 20 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e   offset pPager->
ff90: 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 69 73 20 61  journalOff) is a
ffa0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 70 61 67   well-formed pag
ffb0: 65 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73 74  e record consist
ffc0: 69 6e 67 0a 2a 2a 20 6f 66 20 61 20 76 61 6c 69  ing.** of a vali
ffd0: 64 20 70 61 67 65 20 6e 75 6d 62 65 72 2c 20 70  d page number, p
ffe0: 50 61 67 65 2d 3e 70 61 67 65 53 69 7a 65 20 62  Page->pageSize b
fff0: 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 2c  ytes of content,
10000 20 66 6f 6c 6c 6f 77 65 64 0a 2a 2a 20 62 79 20   followed.** by 
10010 61 20 76 61 6c 69 64 20 63 68 65 63 6b 73 75 6d  a valid checksum
10020 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
10030 72 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f  r never needs to
10040 20 6b 6e 6f 77 20 74 68 69 73 20 69 6e 20 6f 72   know this in or
10050 64 65 72 20 74 6f 20 64 6f 20 69 74 73 20 6a 6f  der to do its jo
10060 62 2e 20 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  b.   This.** rou
10070 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  tine is only use
10080 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 73  d from within as
10090 73 65 72 74 28 29 20 61 6e 64 20 74 65 73 74 63  sert() and testc
100a0 61 73 65 28 29 20 6d 61 63 72 6f 73 2e 0a 2a 2f  ase() macros..*/
100b0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
100c0 72 4e 65 78 74 4a 6f 75 72 6e 61 6c 50 61 67 65  rNextJournalPage
100d0 49 73 56 61 6c 69 64 28 50 61 67 65 72 20 2a 70  IsValid(Pager *p
100e0 50 61 67 65 72 29 7b 0a 20 20 50 67 6e 6f 20 70  Pager){.  Pgno p
100f0 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  gno;           /
10100 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
10110 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  r of the page */
10120 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
10130 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
10140 61 67 65 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  age checksum */.
10150 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
10160 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
10170 20 63 6f 64 65 20 66 72 6f 6d 20 72 65 61 64 20   code from read 
10180 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20  operations */.  
10190 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
101a0 3b 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65  ;    /* The file
101b0 20 64 65 73 63 72 69 70 74 6f 72 20 66 72 6f 6d   descriptor from
101c0 20 77 68 69 63 68 20 77 65 20 61 72 65 20 72 65   which we are re
101d0 61 64 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61  ading */.  u8 *a
101e0 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
101f0 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68  /* Content of th
10200 65 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  e page */..  /* 
10210 52 65 61 64 20 74 68 65 20 70 61 67 65 20 6e 75  Read the page nu
10220 6d 62 65 72 20 68 65 61 64 65 72 20 2a 2f 0a 20  mber header */. 
10230 20 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 6a 66   fd = pPager->jf
10240 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  d;.  rc = read32
10250 62 69 74 73 28 66 64 2c 20 70 50 61 67 65 72 2d  bits(fd, pPager-
10260 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 26 70 67  >journalOff, &pg
10270 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  no);.  if( rc!=S
10280 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74 75  QLITE_OK ){ retu
10290 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20  rn 0; }         
102a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102b0 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45           /*NO_TE
102c0 53 54 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d  ST*/.  if( pgno=
102d0 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
102e0 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
102f0 29 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d  ) ){ return 0; }
10300 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45           /*NO_TE
10310 53 54 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e  ST*/.  if( pgno>
10320 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62  (Pgno)pPager->db
10330 53 69 7a 65 20 29 7b 20 72 65 74 75 72 6e 20 30  Size ){ return 0
10340 3b 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  ; }             
10350 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45           /*NO_TE
10360 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20  ST*/..  /* Read 
10370 74 68 65 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  the checksum */.
10380 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
10390 73 28 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  s(fd, pPager->jo
103a0 75 72 6e 61 6c 4f 66 66 2b 70 50 61 67 65 72 2d  urnalOff+pPager-
103b0 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 26 63 6b  >pageSize+4, &ck
103c0 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  sum);.  if( rc!=
103d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74  SQLITE_OK ){ ret
103e0 75 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20  urn 0; }        
103f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10400 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54            /*NO_T
10410 45 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64  EST*/..  /* Read
10420 20 74 68 65 20 64 61 74 61 20 61 6e 64 20 76 65   the data and ve
10430 72 69 66 79 20 74 68 65 20 63 68 65 63 6b 73 75  rify the checksu
10440 6d 20 2a 2f 0a 20 20 61 44 61 74 61 20 3d 20 28  m */.  aData = (
10450 75 38 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70  u8*)pPager->pTmp
10460 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 73 71  Space;.  rc = sq
10470 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20  lite3OsRead(fd, 
10480 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
10490 61 67 65 53 69 7a 65 2c 20 70 50 61 67 65 72 2d  ageSize, pPager-
104a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 34 29 3b 0a  >journalOff+4);.
104b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
104c0 5f 4f 4b 20 29 7b 20 72 65 74 75 72 6e 20 30 3b  _OK ){ return 0;
104d0 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   }              
104e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104f0 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
10500 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75    if( pager_cksu
10510 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 29  m(pPager, aData)
10520 21 3d 63 6b 73 75 6d 20 29 7b 20 72 65 74 75 72  !=cksum ){ retur
10530 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20  n 0; }          
10540 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
10550 0a 20 20 2f 2a 20 52 65 61 63 68 20 74 68 69 73  .  /* Reach this
10560 20 70 6f 69 6e 74 20 6f 6e 6c 79 20 69 66 20 74   point only if t
10570 68 65 20 70 61 67 65 20 69 73 20 76 61 6c 69 64  he page is valid
10580 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   */.  return 1;.
10590 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
105a0 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
105b0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43  defined(SQLITE_C
105c0 4f 56 45 52 41 47 45 5f 54 45 53 54 29 20 2a 2f  OVERAGE_TEST) */
105d0 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
105e0 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65  r zMaster is the
105f0 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
10600 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
10610 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c  A single journal
10620 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65  .** file that re
10630 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61  ferred to the ma
10640 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
10650 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
10660 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
10670 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
10680 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73  cks if it is pos
10690 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
106a0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
106b0 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20  al file,.** and 
106c0 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73  does so if it is
106d0 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
106e0 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69   zMaster may poi
106f0 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70  nt to Pager.pTmp
10700 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62  Space. So that b
10710 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a  uffer is not .**
10720 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
10730 73 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  se within this f
10740 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57  unction..**.** W
10750 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  hen a master jou
10760 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65  rnal file is cre
10770 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75  ated, it is popu
10780 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  lated with the n
10790 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20  ames .** of all 
107a0 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75  of its child jou
107b0 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72  rnals, one after
107c0 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74   another, format
107d0 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a  ted as utf-8 .**
107e0 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54   encoded text. T
107f0 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63  he end of each c
10800 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild journal fil
10810 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  e is marked with
10820 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69   a .** nul-termi
10830 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30  nator byte (0x00
10840 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69  ). i.e. the enti
10850 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  re contents of a
10860 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
10870 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72  ** file for a tr
10880 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76  ansaction involv
10890 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65  ing two database
108a0 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a  s might be:.**.*
108b0 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  *   "/home/bill/
108c0 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  a.db-journal\x00
108d0 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d  /home/bill/b.db-
108e0 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a  journal\x00".**.
108f0 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72  ** A master jour
10900 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c  nal file may onl
10910 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63  y be deleted onc
10920 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  e all of its chi
10930 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20  ld .** journals 
10940 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64  have been rolled
10950 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   back..**.** Thi
10960 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73  s function reads
10970 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
10980 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
10990 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a  nal file into .*
109a0 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f  * memory and loo
109b0 70 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  ps through each 
109c0 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  of the child jou
109d0 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a  rnal names. For.
109e0 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  ** each child jo
109f0 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73  urnal, it checks
10a00 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69   if:.**.**   * i
10a10 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
10a20 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20  nal exists, and 
10a30 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20  if so.**   * if 
10a40 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
10a50 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66  l contains a ref
10a60 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72  erence to master
10a70 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20   journal .**    
10a80 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a   file zMaster.**
10a90 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a  .** If a child j
10aa0 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
10ab0 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73  und that matches
10ac0 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69   both of the cri
10ad0 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20  teria.** above, 
10ae0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
10af0 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f  turns without do
10b00 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74  ing anything. Ot
10b10 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e  herwise, if.** n
10b20 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75  o such child jou
10b30 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
10b40 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20  d, file zMaster 
10b50 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a  is deleted from.
10b60 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
10b70 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  em using sqlite3
10b80 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a  OsDelete()..**.*
10b90 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
10ba0 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
10bb0 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20  ction, an error 
10bc0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
10bd0 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
10be0 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d  on allocates mem
10bf0 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73  ory by calling s
10c00 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20  qlite3Malloc(). 
10c10 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  If an allocation
10c20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
10c30 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
10c40 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
10c50 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c  if no IO or mall
10c60 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63  oc errors .** oc
10c70 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  cur, SQLITE_OK i
10c80 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
10c90 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e  * TODO: This fun
10ca0 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
10cb0 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f  a single block o
10cc0 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64  f memory to load
10cd0 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63  .** the entire c
10ce0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
10cf0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10d00 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62  le. This could b
10d10 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66  e.** a couple of
10d20 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f   kilobytes or so
10d30 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c   - potentially l
10d40 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70  arger than the p
10d50 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f  age .** size..*/
10d60 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
10d70 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65  r_delmaster(Page
10d80 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
10d90 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
10da0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
10db0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
10dc0 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Vfs;.  int rc;  
10dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10de0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
10df0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
10e00 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f  e *pMaster;    /
10e10 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65  * Malloc'd maste
10e20 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  r-journal file d
10e30 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73  escriptor */.  s
10e40 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f  qlite3_file *pJo
10e50 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c  urnal;   /* Mall
10e60 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e  oc'd child-journ
10e70 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
10e80 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  or */.  char *zM
10e90 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30  asterJournal = 0
10ea0 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66  ; /* Contents of
10eb0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10ec0 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d  file */.  i64 nM
10ed0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20  asterJournal;   
10ee0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
10ef0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10f00 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  le */..  /* Allo
10f10 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 62  cate space for b
10f20 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c  oth the pJournal
10f30 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c   and pMaster fil
10f40 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20  e descriptors.. 
10f50 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75   ** If successfu
10f60 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74  l, open the mast
10f70 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
10f80 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a  for reading..  *
10f90 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73  /.  pMaster = (s
10fa0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71  qlite3_file *)sq
10fb0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
10fc0 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a  pVfs->szOsFile *
10fd0 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20   2);.  pJournal 
10fe0 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
10ff0 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65  *)(((u8 *)pMaste
11000 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46  r) + pVfs->szOsF
11010 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61  ile);.  if( !pMa
11020 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  ster ){.    rc =
11030 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
11040 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73   }else{.    cons
11050 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53  t int flags = (S
11060 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
11070 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
11080 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b  MASTER_JOURNAL);
11090 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
110a0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d  3OsOpen(pVfs, zM
110b0 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20  aster, pMaster, 
110c0 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20  flags, 0);.  }. 
110d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
110e0 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
110f0 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 72 63 20 3d  ter_out;..  rc =
11100 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
11110 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61  ze(pMaster, &nMa
11120 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
11130 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11140 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
11150 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e  er_out;..  if( n
11160 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20  MasterJournal>0 
11170 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f  ){.    char *zJo
11180 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20  urnal;.    char 
11190 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b  *zMasterPtr = 0;
111a0 0a 20 20 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  .    int nMaster
111b0 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  Ptr = pVfs->mxPa
111c0 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f  thname+1;..    /
111d0 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  * Load the entir
111e0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
111f0 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65   file into space
11200 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20   obtained from. 
11210 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61     ** sqlite3_ma
11220 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74  lloc() and point
11230 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
11240 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f  Journal. .    */
11250 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  .    zMasterJour
11260 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71  nal = (char *)sq
11270 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74  lite3Malloc((int
11280 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  )nMasterJournal 
11290 2b 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  + nMasterPtr);. 
112a0 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a     if( !zMasterJ
112b0 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
112c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
112d0 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  M;.      goto de
112e0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
112f0 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65 72 50 74   }.    zMasterPt
11300 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72  r = &zMasterJour
11310 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
11320 61 6c 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  al];.    rc = sq
11330 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73  lite3OsRead(pMas
11340 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
11350 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65  nal, (int)nMaste
11360 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  rJournal, 0);.  
11370 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11380 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
11390 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a  ster_out;..    z
113a0 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65  Journal = zMaste
113b0 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68  rJournal;.    wh
113c0 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a  ile( (zJournal-z
113d0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e  MasterJournal)<n
113e0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
113f0 0a 20 20 20 20 20 20 69 6e 74 20 65 78 69 73 74  .      int exist
11400 73 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  s;.      rc = sq
11410 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
11420 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  fs, zJournal, SQ
11430 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
11440 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20  TS, &exists);.  
11450 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11460 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11470 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
11480 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
11490 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29 7b     if( exists ){
114a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  .        /* One 
114b0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20  of the journals 
114c0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68  pointed to by th
114d0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
114e0 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20   exists..       
114f0 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20   ** Open it and 
11500 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e  check if it poin
11510 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72  ts at the master
11520 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
11530 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75       ** so, retu
11540 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74  rn without delet
11550 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
11560 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
11570 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
11580 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20 69  int c;.        i
11590 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49  nt flags = (SQLI
115a0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
115b0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
115c0 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  N_JOURNAL);.    
115d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
115e0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f  OsOpen(pVfs, zJo
115f0 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c  urnal, pJournal,
11600 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20   flags, 0);.    
11610 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11620 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11630 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
11640 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
11650 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  ..        rc = r
11660 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
11670 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74  (pJournal, zMast
11680 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74  erPtr, nMasterPt
11690 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
116a0 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72  te3OsClose(pJour
116b0 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nal);.        if
116c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
116d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
116e0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
116f0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
11700 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50      c = zMasterP
11710 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63  tr[0]!=0 && strc
11720 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a  mp(zMasterPtr, z
11730 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20  Master)==0;.    
11740 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20      if( c ){.   
11750 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
11760 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
11770 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
11780 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
11790 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67  . */.          g
117a0 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
117b0 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
117c0 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72     }.      zJour
117d0 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53  nal += (sqlite3S
117e0 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c  trlen30(zJournal
117f0 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  )+1);.    }.  }.
11800 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65    .  rc = sqlite
11810 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
11820 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65  zMaster, 0);..de
11830 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69  lmaster_out:.  i
11840 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( zMasterJourna
11850 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
11860 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75  _free(zMasterJou
11870 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69  rnal);.  }  .  i
11880 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  f( pMaster ){.  
11890 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
118a0 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (pMaster);.    a
118b0 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
118c0 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 7d 0a  Journal) );.  }.
118d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
118e0 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
118f0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
11900 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
11910 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20   used to change 
11920 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20  the actual size 
11930 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
11940 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20  .** file in the 
11950 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69  file-system. Thi
11960 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77  s only happens w
11970 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  hen committing a
11980 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a   transaction,.**
11990 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   or rolling back
119a0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28   a transaction (
119b0 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e  including rollin
119c0 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  g back a hot-jou
119d0 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rnal)..**.** If 
119e0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
119f0 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70  e file is not op
11a00 65 6e 2c 20 6f 72 20 61 6e 20 65 78 63 6c 75 73  en, or an exclus
11a10 69 76 65 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 0a  ive lock is not.
11a20 2a 2a 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75  ** held, this fu
11a30 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
11a40 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  p. Otherwise, th
11a50 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
11a60 6c 65 20 69 73 0a 2a 2a 20 63 68 61 6e 67 65 64  le is.** changed
11a70 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20   to nPage pages 
11a80 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70  (nPage*pPager->p
11a90 61 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20  ageSize bytes). 
11aa0 49 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 6f  If the file.** o
11ab0 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e  n disk is curren
11ac0 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20  tly larger than 
11ad0 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68 65  nPage pages, the
11ae0 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a  n use the VFS.**
11af0 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74   xTruncate() met
11b00 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20  hod to truncate 
11b10 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74  it..**.** Or, it
11b20 20 6d 69 67 68 74 20 6d 69 67 68 74 20 62 65 20   might might be 
11b30 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68  the case that th
11b40 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
11b50 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a  s smaller than .
11b60 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20  ** nPage pages. 
11b70 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73  Some operating s
11b80 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61  ystem implementa
11b90 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f  tions can get co
11ba0 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f  nfused if .** yo
11bb0 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74  u try to truncat
11bc0 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65  e a file to some
11bd0 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61   size that is la
11be0 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a  rger than it .**
11bf0 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73   currently is, s
11c00 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61  o detect this ca
11c10 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73  se and write a s
11c20 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20  ingle zero byte 
11c30 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f  to .** the end o
11c40 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69  f the new file i
11c50 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
11c60 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
11c70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  urn SQLITE_OK. I
11c80 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
11c90 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66  curs while modif
11ca0 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61  ying.** the data
11cb0 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72  base file, retur
11cc0 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
11cd0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
11ce0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
11cf0 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67  ger_truncate(Pag
11d00 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
11d10 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
11d20 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11d30 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
11d40 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
11d50 49 56 45 20 26 26 20 69 73 4f 70 65 6e 28 70 50  IVE && isOpen(pP
11d60 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
11d70 20 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65   i64 currentSize
11d80 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 2f  , newSize;.    /
11d90 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61  * TODO: Is it sa
11da0 66 65 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e  fe to use Pager.
11db0 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f  dbFileSize here?
11dc0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
11dd0 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
11de0 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72  Pager->fd, &curr
11df0 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65  entSize);.    ne
11e00 77 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  wSize = pPager->
11e10 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50  pageSize*(i64)nP
11e20 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  age;.    if( rc=
11e30 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75  =SQLITE_OK && cu
11e40 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69  rrentSize!=newSi
11e50 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ze ){.      if( 
11e60 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53  currentSize>newS
11e70 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ize ){.        r
11e80 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
11e90 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64  ncate(pPager->fd
11ea0 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20  , newSize);.    
11eb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11ec0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
11ed0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
11ee0 20 22 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d   "", 1, newSize-
11ef0 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
11f00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11f10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
11f20 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
11f30 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
11f40 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
11f50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11f60 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
11f70 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73 65   of the Pager.se
11f80 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
11f90 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
11fa0 2a 2a 20 70 61 67 65 72 20 62 61 73 65 64 20 6f  ** pager based o
11fb0 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
11fc0 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63  rned by the xSec
11fd0 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a  torSize method.*
11fe0 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61  * of the open da
11ff0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
12000 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
12010 6c 20 62 65 20 75 73 65 64 20 75 73 65 64 20 0a  l be used used .
12020 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
12030 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69  the size and ali
12040 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61  gnment of journa
12050 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a  l header and .**
12060 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12070 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20  pointers within 
12080 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20  created journal 
12090 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  files..**.** For
120a0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
120b0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
120c0 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c  ector size is al
120d0 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a  ways 512 bytes..
120e0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
120f0 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61   for non-tempora
12100 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66  ry files, the ef
12110 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
12120 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61  ize is.** the va
12130 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
12140 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28  the xSectorSize(
12150 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64  ) method rounded
12160 20 75 70 20 74 6f 20 35 31 32 20 69 66 0a 2a 2a   up to 512 if.**
12170 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e   it is less than
12180 20 35 31 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64   512, or rounded
12190 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43   down to MAX_SEC
121a0 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a  TOR_SIZE if it.*
121b0 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
121c0 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  n MAX_SECTOR_SIZ
121d0 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  E..*/.static voi
121e0 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28  d setSectorSize(
121f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
12200 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
12210 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
12220 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
12230 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67   );..  if( !pPag
12240 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
12250 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69      /* Sector si
12260 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  ze doesn't matte
12270 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  r for temporary 
12280 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65  files. Also, the
12290 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79   file.    ** may
122a0 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f   not have been o
122b0 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68  pened yet, in wh
122c0 69 63 68 20 63 61 73 65 20 74 68 65 20 4f 73 53  ich case the OsS
122d0 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
122e0 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67  ** call will seg
122f0 66 61 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  fault..    */.  
12300 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
12310 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  Size = sqlite3Os
12320 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
12330 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66  r->fd);.  }.  if
12340 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
12350 53 69 7a 65 3c 35 31 32 20 29 7b 0a 20 20 20 20  Size<512 ){.    
12360 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
12370 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 0a 20 20  ze = 512;.  }.  
12380 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
12390 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f  orSize>MAX_SECTO
123a0 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73  R_SIZE ){.    as
123b0 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52  sert( MAX_SECTOR
123c0 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20  _SIZE>=512 );.  
123d0 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
123e0 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45 43 54 4f  Size = MAX_SECTO
123f0 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f  R_SIZE;.  }.}../
12400 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
12410 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  e journal and th
12420 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  us restore the d
12430 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a  atabase file to.
12440 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20  ** the state it 
12450 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65  was in before we
12460 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20   started making 
12470 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a  changes.  .**.**
12480 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
12490 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66  e format is as f
124a0 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20  ollows: .**.**  
124b0 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66  (1)  8 byte pref
124c0 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61  ix.  A copy of a
124d0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
124e0 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20  **  (2)  4 byte 
124f0 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
12500 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
12510 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  number of valid 
12520 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20  page records.** 
12530 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75        in the jou
12540 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76  rnal.  If this v
12550 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
12560 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65  ff, then compute
12570 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75   the.**       nu
12580 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
12590 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ords from the jo
125a0 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20  urnal size..**  
125b0 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (3)  4 byte big-
125c0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
125d0 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74  hich is the init
125e0 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ial value for th
125f0 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69  e .**       sani
12600 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  ty checksum..** 
12610 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74   (4)  4 byte int
12620 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
12630 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
12640 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
12650 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
12660 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20  ase to during a 
12670 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35  rollback..**  (5
12680 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
12690 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
126a0 63 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72  ch is the sector
126b0 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64   size.  The head
126c0 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74  er.**       is t
126d0 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69  his many bytes i
126e0 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20  n size..**  (6) 
126f0 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
12700 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
12710 20 69 73 20 74 68 65 20 70 61 67 65 20 63 61 73   is the page cas
12720 65 2e 0a 2a 2a 20 20 28 37 29 20 20 34 20 62 79  e..**  (7)  4 by
12730 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
12740 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
12750 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d  f bytes in the m
12760 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
12770 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68         name.  Th
12780 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  e value may be z
12790 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68  ero (indicate th
127a0 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  at there is no m
127b0 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
127c0 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 38 29  ournal.).**  (8)
127d0 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65    N bytes of the
127e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
127f0 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20  name.  The name 
12800 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d  will be nul-term
12810 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  inated.**       
12820 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f  and might be sho
12830 72 74 65 72 20 74 68 61 6e 20 74 68 65 20 76 61  rter than the va
12840 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35  lue read from (5
12850 29 2e 20 20 49 66 20 74 68 65 20 66 69 72 73 74  ).  If the first
12860 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f   byte.**       o
12870 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30  f the name is \0
12880 30 30 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  00 then there is
12890 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
128a0 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a  al.  The master.
128b0 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c  **       journal
128c0 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20   name is stored 
128d0 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 39  in UTF-8..**  (9
128e0 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  )  Zero or more 
128f0 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c  pages instances,
12900 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73   each as follows
12910 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  :.**        +  4
12920 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
12930 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  r..**        +  
12940 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
12950 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a   bytes of data..
12960 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
12970 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a  yte checksum.**.
12980 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b  ** When we speak
12990 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
129a0 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20  header, we mean 
129b0 74 68 65 20 66 69 72 73 74 20 38 20 69 74 65 6d  the first 8 item
129c0 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68  s above..** Each
129d0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f   entry in the jo
129e0 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74  urnal is an inst
129f0 61 6e 63 65 20 6f 66 20 74 68 65 20 39 74 68 20  ance of the 9th 
12a00 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  item..**.** Call
12a10 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20   the value from 
12a20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65  the second bulle
12a30 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20  t "nRec".  nRec 
12a40 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
12a50 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65  .** valid page e
12a60 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f  ntries in the jo
12a70 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20  urnal.  In most 
12a80 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63  cases, you can c
12a90 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61  ompute the.** va
12aa0 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d  lue of nRec from
12ab0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
12ac0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
12ad0 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a  But if a power.*
12ae0 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  * failure occurr
12af0 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ed while the jou
12b00 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77  rnal was being w
12b10 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64  ritten, it could
12b20 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20   be the.** case 
12b30 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66  that the size of
12b40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12b50 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65  e had already be
12b60 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74  en increased but
12b70 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e  .** the extra en
12b80 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65  tries had not ye
12b90 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79  t made it safely
12ba0 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75   to disk.  In su
12bb0 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68  ch a case,.** th
12bc0 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
12bd0 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68  computed from th
12be0 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c  e file size woul
12bf0 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20  d be too large. 
12c00 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61   For.** that rea
12c10 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75  son, we always u
12c20 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  se the nRec valu
12c30 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  e in the header.
12c40 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52  .**.** If the nR
12c50 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  ec value is 0xff
12c60 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20  ffffff it means 
12c70 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64  that nRec should
12c80 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20   be computed.** 
12c90 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
12ca0 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ze.  This value 
12cb0 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  is used when the
12cc0 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68   user selects th
12cd0 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74  e.** no-sync opt
12ce0 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  ion for the jour
12cf0 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61  nal.  A power fa
12d00 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64  ilure could lead
12d10 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a   to corruption.*
12d20 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  * in this case. 
12d30 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20   But for things 
12d40 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74  like temporary t
12d50 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c  able (which will
12d60 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77   be.** deleted w
12d70 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73  hen the power is
12d80 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f   restored) we do
12d90 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a  n't care.  .**.*
12da0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70  * If the file op
12db0 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72  ened as the jour
12dc0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
12dd0 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a  a well-formed.**
12de0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
12df0 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20  en all pages up 
12e00 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72  to the first cor
12e10 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20  rupted page are 
12e20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28  rolled.** back (
12e30 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74  or no pages if t
12e40 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
12e50 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e  r is corrupted).
12e60 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
12e70 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c  e.** is then del
12e80 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  eted and SQLITE_
12e90 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73  OK returned, jus
12ea0 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75  t as if no corru
12eb0 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65  ption had.** bee
12ec0 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  n encountered..*
12ed0 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f  *.** If an I/O o
12ee0 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
12ef0 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75   occurs, the jou
12f00 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74  rnal-file is not
12f10 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20   deleted.** and 
12f20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
12f30 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
12f40 20 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d   The isHot param
12f50 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74  eter indicates t
12f60 68 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  hat we are tryin
12f70 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  g to rollback a 
12f80 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20  journal.** that 
12f90 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a  might be a hot j
12fa0 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20  ournal.  Or, it 
12fb0 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68  could be that th
12fc0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a  e journal is .**
12fd0 20 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75   preserved becau
12fe0 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44  se of JOURNALMOD
12ff0 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55  E_PERSIST or JOU
13000 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
13010 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  E..** If the jou
13020 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68  rnal really is h
13030 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61  ot, reset the pa
13040 67 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20  ger cache prior 
13050 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20  rolling.** back 
13060 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66  any content.  If
13070 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
13080 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e  merely persisten
13090 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a  t, no reset is.*
130a0 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  * needed..*/.sta
130b0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
130c0 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
130d0 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29  ager, int isHot)
130e0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
130f0 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e  *pVfs = pPager->
13100 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b  pVfs;.  i64 szJ;
13110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13120 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
13130 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
13140 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e  bytes */.  u32 n
13150 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
13160 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13170 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   Records in the 
13180 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
13190 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
131a0 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
131b0 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
131c0 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
131d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
131e0 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
131f0 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
13200 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  es */.  int rc; 
13210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13220 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
13230 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  of a subroutine 
13240 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31  */.  int res = 1
13250 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
13260 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
13270 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  by sqlite3OsAcce
13280 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ss() */.  char *
13290 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20  zMaster = 0;    
132a0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61     /* Name of ma
132b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
132c0 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e  e if any */.  in
132d0 74 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  t needPagerReset
132e0 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74  ;      /* True t
132f0 6f 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69  o reset page pri
13300 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65  or to first page
13310 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20   rollback */..  
13320 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
13330 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
13340 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
13350 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20  l.  Abort early 
13360 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  if.  ** the jour
13370 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  nal is empty..  
13380 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
13390 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
133a0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
133b0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
133c0 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b  ger->jfd, &szJ);
133d0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
133e0 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29  E_OK || szJ==0 )
133f0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
13400 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
13410 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74  /* Read the mast
13420 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
13430 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
13440 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
13450 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61  nt..  ** If a ma
13460 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
13470 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66  e name is specif
13480 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c  ied, but the fil
13490 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72  e is not.  ** pr
134a0 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74  esent on disk, t
134b0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
134c0 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64  is not hot and d
134d0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
134e0 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62  be.  ** played b
134f0 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ack..  **.  ** T
13500 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79  ODO: Technically
13510 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
13520 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75  s an error becau
13530 73 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68  se it assumes th
13540 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50  at.  ** buffer P
13550 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69  ager.pTmpSpace i
13560 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s (mxPathname+1)
13570 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72   bytes or larger
13580 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a  . i.e. that.  **
13590 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69   (pPager->pageSi
135a0 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56  ze >= pPager->pV
135b0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
135c0 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78  ). Using os_unix
135d0 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68  .c,.  **  mxPath
135e0 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69  name is 512, whi
135f0 63 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ch is the same a
13600 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c  s the minimum al
13610 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20  lowable value.  
13620 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e  ** for pageSize.
13630 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20  .  */.  zMaster 
13640 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
13650 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64  ace;.  rc = read
13660 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
13670 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
13680 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
13690 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
136a0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
136b0 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b  E_OK && zMaster[
136c0 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  0] ){.    rc = s
136d0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
136e0 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51  Vfs, zMaster, SQ
136f0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
13700 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20  TS, &res);.  }. 
13710 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
13720 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13730 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20  K || !res ){.   
13740 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
13750 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  ck;.  }.  pPager
13760 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
13770 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73  ;.  needPagerRes
13780 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f  et = isHot;..  /
13790 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d  * This loop term
137a0 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68  inates either wh
137b0 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c  en a readJournal
137c0 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70  Hdr() or .  ** p
137d0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
137e0 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65  e_page() call re
137f0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
13800 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  E or an IO error
13810 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a   .  ** occurs. .
13820 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20    */.  while( 1 
13830 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 55 6e 73  ){.    int isUns
13840 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ync = 0;..    /*
13850 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a   Read the next j
13860 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72  ournal header fr
13870 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
13880 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  ile.  If there a
13890 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e  re.    ** not en
138a0 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20  ough bytes left 
138b0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
138c0 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65  ile for a comple
138d0 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20  te header, or.  
138e0 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75    ** it is corru
138f0 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f  pted, then a pro
13900 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69  cess must of fai
13910 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
13920 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
13930 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
13940 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
13950 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
13960 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
13970 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
13980 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20  (pPager, isHot, 
13990 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
139a0 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
139b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
139c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
139d0 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
139e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
139f0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
13a00 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
13a10 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
13a20 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
13a30 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
13a40 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
13a50 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
13a60 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
13a70 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
13a80 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
13a90 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
13aa0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
13ab0 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
13ac0 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
13ad0 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
13ae0 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
13af0 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
13b00 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
13b10 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
13b20 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
13b30 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
13b40 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
13b50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
13b60 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
13b70 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
13b80 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
13b90 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
13ba0 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
13bb0 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
13bc0 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
13bd0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
13be0 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64  If nRec is 0 and
13bf0 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69   this rollback i
13c00 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  s of a transacti
13c10 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68  on created by th
13c20 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  is.    ** proces
13c30 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73  s and if this is
13c40 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65   the final heade
13c50 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
13c60 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a  , then it means.
13c70 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73      ** that this
13c80 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75   part of the jou
13c90 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66  rnal was being f
13ca0 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f  illed but has no
13cb0 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a  t yet been.    *
13cc0 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  * synced to disk
13cd0 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e  .  Compute the n
13ce0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62  umber of pages b
13cf0 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61  ased on the rema
13d00 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a  ining.    ** siz
13d10 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20  e of the file.. 
13d20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
13d30 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74   third term of t
13d40 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65  he test was adde
13d50 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20  d to fix ticket 
13d60 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68  #2565..    ** Wh
13d70 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
13d80 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e  a hot journal, n
13d90 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65  Rec==0 always me
13da0 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ans that the nex
13db0 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f  t.    ** chunk o
13dc0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f  f the journal co
13dd0 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65  ntains zero page
13de0 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
13df0 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a  ack.  But.    **
13e00 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f   when doing a RO
13e10 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e  LLBACK and the n
13e20 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20  Rec==0 chunk is 
13e30 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69  the last chunk i
13e40 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  n.    ** the jou
13e50 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  rnal, it means t
13e60 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
13e70 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64  might contain ad
13e80 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20  ditional.    ** 
13e90 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20  pages that need 
13ea0 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
13eb0 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e  k and that the n
13ec0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a  umber of pages .
13ed0 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
13ee0 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20   computed based 
13ef0 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
13f00 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  ile size..    */
13f10 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
13f20 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74  Rec==0 && !isHot
13f30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61  .         && pPa
13f40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b  ger->journalHdr+
13f50 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
13f60 50 61 67 65 72 29 21 3d 70 50 61 67 65 72 2d 3e  Pager)!=pPager->
13f70 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 20  journalOff.     
13f80 20 20 20 20 26 26 20 28 28 73 7a 4a 20 2d 20 70      && ((szJ - p
13f90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
13fa0 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  f) / JOURNAL_PG_
13fb0 53 5a 28 70 50 61 67 65 72 29 29 3e 30 0a 20 20  SZ(pPager))>0.  
13fc0 20 20 20 20 20 20 20 26 26 20 70 61 67 65 72 4e         && pagerN
13fd0 65 78 74 4a 6f 75 72 6e 61 6c 50 61 67 65 49 73  extJournalPageIs
13fe0 56 61 6c 69 64 28 70 50 61 67 65 72 29 0a 20 20  Valid(pPager).  
13ff0 20 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 52 65    );.    if( nRe
14000 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26  c==0 && !isHot &
14010 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  &.        pPager
14020 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
14030 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
14040 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
14050 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20  rnalOff ){.     
14060 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73   nRec = (int)((s
14070 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
14080 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e  rnalOff) / JOURN
14090 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
140a0 29 3b 0a 20 20 20 20 20 20 69 73 55 6e 73 79 6e  );.      isUnsyn
140b0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  c = 1;.    }..  
140c0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
140d0 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
140e0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
140f0 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65  ournal, truncate
14100 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
14110 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74  base file back t
14120 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
14130 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
14140 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
14150 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
14160 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
14170 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
14180 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
14190 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20  er, mxPg);.     
141a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
141b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
141c0 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
141d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
141e0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
141f0 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  mxPg;.    }..   
14200 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
14210 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
14220 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  he journal and b
14230 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  ack into the .  
14240 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
14250 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63  le and/or page c
14260 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ache..    */.   
14270 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63   for(u=0; u<nRec
14280 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; u++){.      if
14290 28 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  ( needPagerReset
142a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
142b0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
142c0 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50 61 67  .        needPag
142d0 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20  erReset = 0;.   
142e0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
142f0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
14300 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 31  ne_page(pPager,1
14310 2c 69 73 55 6e 73 79 6e 63 2c 26 70 50 61 67 65  ,isUnsync,&pPage
14320 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c  r->journalOff,0,
14330 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
14340 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14350 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
14360 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
14370 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
14380 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
14390 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
143a0 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
143b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
143c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
143d0 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61        /* If we a
143e0 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c  re unable to rol
143f0 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64 20  lback, quit and 
14400 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
14410 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
14420 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63  de.  This will c
14430 61 75 73 65 20 74 68 65 20 70 61 67 65 72 20 74  ause the pager t
14440 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f  o enter the erro
14450 72 20 73 74 61 74 65 0a 20 20 20 20 20 20 20 20  r state.        
14460 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20    ** so that no 
14470 66 75 72 74 68 65 72 20 68 61 72 6d 20 77 69 6c  further harm wil
14480 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72 68  l be done.  Perh
14490 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20 20  aps the next.   
144a0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
144b0 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20  s to come along 
144c0 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20  will be able to 
144d0 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61 74  rollback the dat
144e0 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20  abase..         
144f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f   */.          go
14500 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
14510 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14520 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
14530 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20  *NOTREACHED*/.  
14540 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e  assert( 0 );..en
14550 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a  d_playback:.  /*
14560 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c   Following a rol
14570 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62  lback, the datab
14580 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  ase file should 
14590 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f  be back in its o
145a0 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61  riginal.  ** sta
145b0 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  te prior to the 
145c0 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
145d0 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76  nsaction, so inv
145e0 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c  oke the.  ** SQL
145f0 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
14600 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74  HANGED file-cont
14610 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69  rol method to di
14620 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61  sable the.  ** a
14630 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68  ssertion that th
14640 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
14650 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69  unter was modifi
14660 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
14670 74 28 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66  t(.    pPager->f
14680 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d 30 20 7c  d->pMethods==0 |
14690 7c 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  |.    sqlite3OsF
146a0 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65  ileControl(pPage
146b0 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e  r->fd,SQLITE_FCN
146c0 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c  TL_DB_UNCHANGED,
146d0 30 29 3e 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  0)>=SQLITE_OK.  
146e0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
146f0 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70   playback is hap
14700 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63  pening automatic
14710 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74  ally as a result
14720 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20   of an IO or .  
14730 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20  ** malloc error 
14740 74 68 61 74 20 6f 63 63 75 72 72 65 64 20 61 66  that occurred af
14750 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ter the change-c
14760 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
14770 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66  ed but .  ** bef
14780 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
14790 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65  ion was committe
147a0 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e  d, then the chan
147b0 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a  ge-counter .  **
147c0 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61   modification ma
147d0 79 20 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e  y just have been
147e0 20 72 65 76 65 72 74 65 64 2e 20 49 66 20 74 68   reverted. If th
147f0 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78  is happens in ex
14800 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f  clusive .  ** mo
14810 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75  de, then subsequ
14820 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ent transactions
14830 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68   performed by th
14840 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c  e connection wil
14850 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74  l not.  ** updat
14860 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
14870 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69  nter at all. Thi
14880 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61  s may lead to ca
14890 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63  che inconsistenc
148a0 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20  y.  ** problems 
148b0 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73  for other proces
148c0 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e  ses at some poin
148d0 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e  t in the future.
148e0 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69   So, just.  ** i
148f0 6e 20 63 61 73 65 20 74 68 69 73 20 68 61 73 20  n case this has 
14900 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20  happened, clear 
14910 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  the changeCountD
14920 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20  one flag now..  
14930 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  */.  pPager->cha
14940 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
14950 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
14960 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
14970 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61  TE_OK ){.    zMa
14980 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
14990 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63  TmpSpace;.    rc
149a0 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
149b0 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
149c0 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
149d0 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
149e0 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74  ame+1);.    test
149f0 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
14a00 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  _OK );.  }.  if(
14a10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14a20 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
14a30 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
14a40 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
14a50 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a 20 20 20 20  [0]!='\0');.    
14a60 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
14a70 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
14a80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14a90 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d  OK && zMaster[0]
14aa0 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f   && res ){.    /
14ab0 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
14ac0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
14ad0 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  and this routine
14ae0 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63   will return suc
14af0 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65  cess,.    ** see
14b00 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
14b10 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
14b20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
14b30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
14b40 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
14b50 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
14b60 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
14b70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14b80 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
14b90 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
14ba0 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61   variable may ha
14bb0 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20  ve been updated 
14bc0 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20  while rolling.  
14bd0 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ** back a journa
14be0 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  l created by a p
14bf0 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69  rocess with a di
14c00 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73  fferent sector s
14c10 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  ize.  ** value. 
14c20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20  Reset it to the 
14c30 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f  correct value fo
14c40 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  r this process..
14c50 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72    */.  setSector
14c60 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
14c70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
14c80 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73 61 76  .** Playback sav
14c90 65 70 6f 69 6e 74 20 70 53 61 76 65 70 6f 69 6e  epoint pSavepoin
14ca0 74 2e 20 4f 72 2c 20 69 66 20 70 53 61 76 65 70  t. Or, if pSavep
14cb0 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e  oint==NULL, then
14cc0 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65   playback.** the
14cd0 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
14ce0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
14cf0 20 63 61 73 65 20 70 53 61 76 65 70 6f 69 6e 74   case pSavepoint
14d00 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77 68  ==NULL occurs wh
14d10 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43  en .** a ROLLBAC
14d20 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20  K TO command is 
14d30 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56  invoked on a SAV
14d40 45 50 4f 49 4e 54 20 74 68 61 74 20 69 73 20 61  EPOINT that is a
14d50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a   transaction .**
14d60 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a   savepoint..**.*
14d70 2a 20 57 68 65 6e 20 70 53 61 76 65 70 6f 69 6e  * When pSavepoin
14d80 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d  t is not NULL (m
14d90 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61  eaning a non-tra
14da0 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
14db0 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20  nt is .** being 
14dc0 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74 68  rolled back), th
14dd0 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
14de0 63 6f 6e 73 69 73 74 73 20 6f 66 20 75 70 20 74  consists of up t
14df0 6f 20 74 68 72 65 65 20 73 74 61 67 65 73 2c 0a  o three stages,.
14e00 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 69 6e 20  ** performed in 
14e10 74 68 65 20 6f 72 64 65 72 20 73 70 65 63 69 66  the order specif
14e20 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50  ied:.**.**   * P
14e30 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 20  ages are played 
14e40 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
14e50 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
14e60 69 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a 20 20  ing at byte.**  
14e70 20 20 20 6f 66 66 73 65 74 20 50 61 67 65 72 53     offset PagerS
14e80 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74  avepoint.iOffset
14e90 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
14ea0 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72  to .**     Pager
14eb0 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
14ec0 66 73 65 74 2c 20 6f 72 20 74 6f 20 74 68 65 20  fset, or to the 
14ed0 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  end of the main 
14ee0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66  journal.**     f
14ef0 69 6c 65 20 69 66 20 50 61 67 65 72 53 61 76 65  ile if PagerSave
14f00 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
14f10 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20   is zero..**.** 
14f20 20 20 2a 20 49 66 20 50 61 67 65 72 53 61 76 65    * If PagerSave
14f30 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
14f40 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
14f50 65 6e 20 70 61 67 65 73 20 61 72 65 20 70 6c 61  en pages are pla
14f60 79 65 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20  yed.**     back 
14f70 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 74 68  starting from th
14f80 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
14f90 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
14fa0 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50  lowing .**     P
14fb0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
14fc0 64 72 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  drOffset to the 
14fd0 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  end of the main 
14fe0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
14ff0 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72  .**   * Pages ar
15000 65 20 74 68 65 6e 20 70 6c 61 79 65 64 20 62 61  e then played ba
15010 63 6b 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ck from the sub-
15020 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74  journal file, st
15030 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69  arting.**     wi
15040 74 68 20 74 68 65 20 50 61 67 65 72 53 61 76 65  th the PagerSave
15050 70 6f 69 6e 74 2e 69 53 75 62 52 65 63 20 61 6e  point.iSubRec an
15060 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
15070 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20  the end of.**   
15080 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    the journal fi
15090 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67  le..**.** Throug
150a0 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63  hout the rollbac
150b0 6b 20 70 72 6f 63 65 73 73 2c 20 65 61 63 68 20  k process, each 
150c0 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 72  time a page is r
150d0 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 0a  olled back, the.
150e0 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
150f0 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 61   bit is set in a
15100 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72   bitvec structur
15110 65 20 28 76 61 72 69 61 62 6c 65 20 70 44 6f 6e  e (variable pDon
15120 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c  e in the.** impl
15130 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77  ementation below
15140 29 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  ). This is used 
15150 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 61  to ensure that a
15160 20 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a   page is only.**
15170 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
15180 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 20 69   first time it i
15190 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e  s encountered in
151a0 20 65 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e   either journal.
151b0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65 70  .**.** If pSavep
151c0 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  oint is NULL, th
151d0 65 6e 20 70 61 67 65 73 20 61 72 65 20 6f 6e 6c  en pages are onl
151e0 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  y played back fr
151f0 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a  om the main.** j
15200 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
15210 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f  re is no need fo
15220 72 20 61 20 62 69 74 76 65 63 20 69 6e 20 74 68  r a bitvec in th
15230 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
15240 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 62  n either case, b
15250 65 66 6f 72 65 20 70 6c 61 79 62 61 63 6b 20 63  efore playback c
15260 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20 50 61 67  ommences the Pag
15270 65 72 2e 64 62 53 69 7a 65 20 76 61 72 69 61 62  er.dbSize variab
15280 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65 74 20 74  le.** is reset t
15290 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68 61 74  o the value that
152a0 20 69 74 20 68 65 6c 64 20 61 74 20 74 68 65 20   it held at the 
152b0 73 74 61 72 74 20 6f 66 20 74 68 65 20 73 61 76  start of the sav
152c0 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74  epoint .** (or t
152d0 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20  ransaction). No 
152e0 70 61 67 65 20 77 69 74 68 20 61 20 70 61 67 65  page with a page
152f0 2d 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20  -number greater 
15300 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 0a  than this value.
15310 2a 2a 20 69 73 20 70 6c 61 79 65 64 20 62 61 63  ** is played bac
15320 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20 65 6e 63  k. If one is enc
15330 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20 73  ountered it is s
15340 69 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a  imply skipped..*
15350 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
15360 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
15370 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
15380 72 2c 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  r, PagerSavepoin
15390 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a  t *pSavepoint){.
153a0 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
153b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 66             /* Ef
153c0 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20  fective size of 
153d0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
153e0 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
153f0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
15400 2a 20 45 6e 64 20 6f 66 20 66 69 72 73 74 20 73  * End of first s
15410 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a  egment of main-j
15420 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a  ournal records *
15430 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
15440 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20  ITE_OK;      /* 
15450 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
15460 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d   Bitvec *pDone =
15470 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74   0;       /* Bit
15480 76 65 63 20 74 6f 20 65 6e 73 75 72 65 20 70 61  vec to ensure pa
15490 67 65 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ges played back 
154a0 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20  only once */..  
154b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
154c0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
154d0 52 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  RED );..  /* All
154e0 6f 63 61 74 65 20 61 20 62 69 74 76 65 63 20 74  ocate a bitvec t
154f0 6f 20 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74  o use to store t
15500 68 65 20 73 65 74 20 6f 66 20 70 61 67 65 73 20  he set of pages 
15510 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20  rolled back */. 
15520 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20   if( pSavepoint 
15530 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73  ){.    pDone = s
15540 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
15550 74 65 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e  te(pSavepoint->n
15560 4f 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21  Orig);.    if( !
15570 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72  pDone ){.      r
15580 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
15590 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  EM;.    }.  }.. 
155a0 20 2f 2a 20 53 65 74 20 74 68 65 20 64 61 74 61   /* Set the data
155b0 62 61 73 65 20 73 69 7a 65 20 62 61 63 6b 20 74  base size back t
155c0 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 77  o the value it w
155d0 61 73 20 62 65 66 6f 72 65 20 74 68 65 20 73 61  as before the sa
155e0 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65  vepoint .  ** be
155f0 69 6e 67 20 72 65 76 65 72 74 65 64 20 77 61 73  ing reverted was
15600 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20   opened..  */.  
15610 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
15620 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20 70 53   pSavepoint ? pS
15630 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20  avepoint->nOrig 
15640 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  : pPager->dbOrig
15650 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 55 73 65 20  Size;..  /* Use 
15660 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15670 66 66 20 61 73 20 74 68 65 20 65 66 66 65 63 74  ff as the effect
15680 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
15690 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  main rollback.  
156a0 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  ** journal.  The
156b0 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67   actual file mig
156c0 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ht be larger tha
156d0 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50  n this in.  ** P
156e0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
156f0 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47  _TRUNCATE or PAG
15700 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
15710 45 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79  ERSIST.  But any
15720 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20  thing.  ** past 
15730 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15740 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73  ff is off-limits
15750 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73   to us..  */.  s
15760 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ = pPager->jou
15770 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 42  rnalOff;..  /* B
15780 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20  egin by rolling 
15790 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f  back records fro
157a0 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
157b0 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20  al starting at. 
157c0 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
157d0 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63  nt.iOffset and c
157e0 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
157f0 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
15800 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65  ader..  ** There
15810 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64   might be record
15820 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  s in the main jo
15830 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20  urnal that have 
15840 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  a page number.  
15850 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
15860 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
15870 62 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65  base size (pPage
15880 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74  r->dbSize) but t
15890 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  hose.  ** will b
158a0 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61  e skipped automa
158b0 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20  tically.  Pages 
158c0 61 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f  are added to pDo
158d0 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20  ne as they.  ** 
158e0 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e  are played back.
158f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  .  */.  if( pSav
15900 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 69 48  epoint ){.    iH
15910 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69  drOff = pSavepoi
15920 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3f  nt->iHdrOffset ?
15930 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64   pSavepoint->iHd
15940 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20  rOffset : szJ;. 
15950 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
15960 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69  alOff = pSavepoi
15970 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20  nt->iOffset;.   
15980 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
15990 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
159a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72  >journalOff<iHdr
159b0 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Off ){.      rc 
159c0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
159d0 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
159e0 2c 20 31 2c 20 30 2c 20 26 70 50 61 67 65 72 2d  , 1, 0, &pPager-
159f0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 2c 20  >journalOff, 1, 
15a00 70 44 6f 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pDone);.    }.  
15a10 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
15a20 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
15a30 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
15a40 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
15a50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74  ;.  }..  /* Cont
15a60 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63  inue rolling bac
15a70 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66  k records out of
15a80 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
15a90 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
15aa0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  ** the first jou
15ab0 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e  rnal header seen
15ac0 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
15ad0 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63 74  until the effect
15ae0 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20  ive end.  ** of 
15af0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
15b00 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65   file.  Continue
15b10 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d   to skip out-of-
15b20 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a  range pages and.
15b30 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64    ** continue ad
15b40 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65  ding pages rolle
15b50 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e  d back to pDone.
15b60 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72  .  */.  while( r
15b70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
15b80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15b90 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33  ff<szJ ){.    u3
15ba0 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  2 ii;           
15bb0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
15bc0 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65   */.    u32 nJRe
15bd0 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75  c = 0;     /* Nu
15be0 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20  mber of Journal 
15bf0 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75  Records */.    u
15c00 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63  32 dummy;.    rc
15c10 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
15c20 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a  r(pPager, 0, szJ
15c30 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79  , &nJRec, &dummy
15c40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
15c50 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
15c60 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ;..    /*.    **
15c70 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f   The "pPager->jo
15c80 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
15c90 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
15ca0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
15cb0 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74  Off".    ** test
15cc0 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74   is related to t
15cd0 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65  icket #2565.  Se
15ce0 65 20 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e  e the discussion
15cf0 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70   in the.    ** p
15d00 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
15d10 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64  function for add
15d20 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
15d30 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
15d40 61 73 73 65 72 74 28 20 21 28 6e 4a 52 65 63 3d  assert( !(nJRec=
15d50 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  =0.         && p
15d60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
15d70 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
15d80 28 70 50 61 67 65 72 29 21 3d 70 50 61 67 65 72  (pPager)!=pPager
15d90 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20  ->journalOff.   
15da0 20 20 20 20 20 20 26 26 20 28 28 73 7a 4a 20 2d        && ((szJ -
15db0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15dc0 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50  Off) / JOURNAL_P
15dd0 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3e 30 0a  G_SZ(pPager))>0.
15de0 20 20 20 20 20 20 20 20 20 26 26 20 70 61 67 65           && page
15df0 72 4e 65 78 74 4a 6f 75 72 6e 61 6c 50 61 67 65  rNextJournalPage
15e00 49 73 56 61 6c 69 64 28 70 50 61 67 65 72 29 29  IsValid(pPager))
15e10 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
15e20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26  nJRec==0 .     &
15e30 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
15e40 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
15e50 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
15e60 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
15e70 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52      ){.      nJR
15e80 65 63 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20  ec = (u32)((szJ 
15e90 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
15ea0 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47  lOff)/JOURNAL_PG
15eb0 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
15ec0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30    }.    for(ii=0
15ed0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
15ee0 26 26 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70  && ii<nJRec && p
15ef0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
15f00 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20  f<szJ; ii++){.  
15f10 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
15f20 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
15f30 28 70 50 61 67 65 72 2c 20 31 2c 20 30 2c 20 26  (pPager, 1, 0, &
15f40 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15f50 66 66 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20  ff, 1, pDone);. 
15f60 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
15f70 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
15f80 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   );.  }.  assert
15f90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15fa0 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
15fb0 61 6c 4f 66 66 3d 3d 73 7a 4a 20 29 3b 0a 0a 20  alOff==szJ );.. 
15fc0 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f   /* Finally,  ro
15fd0 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72 6f  llback pages fro
15fe0 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
15ff0 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20 77 65  l.  Page that we
16000 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73  re.  ** previous
16010 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f  ly rolled back o
16020 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ut of the main j
16030 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65 20  ournal (and are 
16040 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a  hence in pDone).
16050 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69    ** will be ski
16060 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61  pped.  Out-of-ra
16070 6e 67 65 20 70 61 67 65 73 20 61 72 65 20 61 6c  nge pages are al
16080 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  so skipped..  */
16090 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
160a0 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b  t ){.    u32 ii;
160b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
160c0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
160d0 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
160e0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62  pSavepoint->iSub
160f0 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  Rec*(4+pPager->p
16100 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 66 6f  ageSize);.    fo
16110 72 28 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d  r(ii=pSavepoint-
16120 3e 69 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51  >iSubRec; rc==SQ
16130 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50  LITE_OK && ii<pP
16140 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69  ager->nSubRec; i
16150 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
16160 72 74 28 20 6f 66 66 73 65 74 3d 3d 69 69 2a 28  rt( offset==ii*(
16170 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
16180 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ze) );.      rc 
16190 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
161a0 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
161b0 2c 20 30 2c 20 30 2c 20 26 6f 66 66 73 65 74 2c  , 0, 0, &offset,
161c0 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20 20   1, pDone);.    
161d0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
161e0 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
161f0 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42  .  }..  sqlite3B
16200 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f  itvecDestroy(pDo
16210 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ne);.  if( rc==S
16220 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16230 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
16240 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20  ff = szJ;.  }.  
16250 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16260 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d  .** Change the m
16270 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
16280 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
16290 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65   that are allowe
162a0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
162b0 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
162c0 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
162d0 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
162e0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
162f0 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67  etCachesize(pPag
16300 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50  er->pPCache, mxP
16310 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  age);.}../*.** A
16320 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74  djust the robust
16330 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61  ness of the data
16340 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64  base to damage d
16350 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
16360 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69  .** or power fai
16370 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e  lures by changin
16380 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  g the number of 
16390 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72  syncs()s when wr
163a0 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c  iting.** the rol
163b0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20  lback journal.  
163c0 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
163d0 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  levels:.**.**   
163e0 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74   OFF       sqlit
163f0 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65  e3OsSync() is ne
16400 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69  ver called.  Thi
16410 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
16420 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
16430 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61   for temporary a
16440 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c  nd transient fil
16450 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52  es..**.**    NOR
16460 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  MAL    The journ
16470 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63  al is synced onc
16480 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
16490 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
164a0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
164b0 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20  abase.  This is 
164c0 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74  normally adequat
164d0 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75  e protection, bu
164e0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
164f0 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69    it is theoreti
16500 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20  cally possible, 
16510 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69  though very unli
16520 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20  kely,.**        
16530 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e        that an in
16540 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66  opertune power f
16550 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
16560 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  ve the journal.*
16570 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
16580 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20  n a state which 
16590 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61  would cause dama
165a0 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
165b0 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  se.**           
165c0 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f     when it is ro
165d0 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
165e0 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68      FULL      Th
165f0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
16600 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65  ced twice before
16610 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
16620 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
16630 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77       database (w
16640 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f  ith some additio
16650 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
16660 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  - the nRec field
16670 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
16680 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
16690 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77  header - being w
166a0 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65  ritten in betwee
166b0 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20  n the two.**    
166c0 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29            syncs)
166d0 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20  .  If we assume 
166e0 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a  that writing a.*
166f0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
16700 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
16710 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65  r is atomic, the
16720 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76  n this mode prov
16730 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ides.**         
16740 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74       assurance t
16750 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
16760 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72  will not be corr
16770 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  upted to the.** 
16780 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69               poi
16790 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61  nt of causing da
167a0 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
167b0 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  base during roll
167c0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65  back..**.** Nume
167d0 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63  ric values assoc
167e0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65  iated with these
167f0 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d   states are OFF=
16800 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a  =1, NORMAL=2,.**
16810 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a   and FULL=3..*/.
16820 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16830 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
16840 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  S.void sqlite3Pa
16850 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65  gerSetSafetyLeve
16860 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
16870 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20   int level, int 
16880 62 46 75 6c 6c 46 73 79 6e 63 29 7b 0a 20 20 70  bFullFsync){.  p
16890 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
168a0 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50   (level==1 || pP
168b0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20  ager->tempFile) 
168c0 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ?1:0;.  pPager->
168d0 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76 65  fullSync = (leve
168e0 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d  l==3 && !pPager-
168f0 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b  >tempFile) ?1:0;
16900 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  .  pPager->sync_
16910 66 6c 61 67 73 20 3d 20 28 62 46 75 6c 6c 46 73  flags = (bFullFs
16920 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ync?SQLITE_SYNC_
16930 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59 4e 43  FULL:SQLITE_SYNC
16940 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66 28 20  _NORMAL);.  if( 
16950 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
16960 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
16970 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  c = 0;.}.#endif.
16980 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
16990 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
169a0 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e  able is incremen
169b0 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65  ted whenever the
169c0 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65   library.** atte
169d0 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74  mpts to open a t
169e0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20  emporary file.  
169f0 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
16a00 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20   is used for.** 
16a10 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
16a20 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a  ysis only.  .*/.
16a30 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
16a40 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  ST.int sqlite3_o
16a50 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20  pentemp_count = 
16a60 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
16a70 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   Open a temporar
16a80 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72  y file..**.** Wr
16a90 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ite the file des
16aa0 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46  criptor into *pF
16ab0 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ile. Return SQLI
16ac0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
16ad0 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68   .** or some oth
16ae0 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  er error code if
16af0 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53   we fail. The OS
16b00 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61   will automatica
16b10 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74  lly .** delete t
16b20 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
16b30 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  e when it is clo
16b40 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  sed..**.** The f
16b50 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 74  lags passed to t
16b60 68 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f 70  he VFS layer xOp
16b70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74 68  en() call are th
16b80 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  ose specified.**
16b90 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 76 66   by parameter vf
16ba0 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74 68  sFlags ORed with
16bb0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
16bc0 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  **.**     SQLITE
16bd0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a  _OPEN_READWRITE.
16be0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
16bf0 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20 20  EN_CREATE.**    
16c00 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
16c10 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53 51  LUSIVE.**     SQ
16c20 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
16c30 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69  ONCLOSE.*/.stati
16c40 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 74  c int pagerOpent
16c50 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50  emp(.  Pager *pP
16c60 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  ager,        /* 
16c70 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  The pager object
16c80 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
16c90 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57  le *pFile,  /* W
16ca0 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65  rite the file de
16cb0 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f  scriptor here */
16cc0 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  .  int vfsFlags 
16cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
16ce0 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
16cf0 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29   to the VFS */.)
16d00 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
16d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
16d20 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66  urn code */..#if
16d30 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
16d40 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65    sqlite3_opente
16d50 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20  mp_count++;  /* 
16d60 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  Used for testing
16d70 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
16d80 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ly */.#endif..  
16d90 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c  vfsFlags |=  SQL
16da0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
16db0 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
16dc0 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20  _CREATE |.      
16dd0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
16de0 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51  N_EXCLUSIVE | SQ
16df0 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
16e00 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20  ONCLOSE;.  rc = 
16e10 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50  sqlite3OsOpen(pP
16e20 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70  ager->pVfs, 0, p
16e30 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20  File, vfsFlags, 
16e40 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  0);.  assert( rc
16e50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
16e60 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a  sOpen(pFile) );.
16e70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16e80 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75  /*.** Set the bu
16e90 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy handler funct
16ea0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ion..**.** The p
16eb0 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68 65  ager invokes the
16ec0 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 66   busy-handler if
16ed0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29   sqlite3OsLock()
16ee0 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c   returns .** SQL
16ef0 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74 72  ITE_BUSY when tr
16f00 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20  ying to upgrade 
16f10 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20  from no-lock to 
16f20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a  a SHARED lock,.*
16f30 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e 67  * or when trying
16f40 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d   to upgrade from
16f50 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
16f60 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45   to an EXCLUSIVE
16f70 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f   .** lock. It do
16f80 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20  es *not* invoke 
16f90 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
16fa0 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
16fb0 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74  from.** SHARED t
16fc0 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20 77  o RESERVED, or w
16fd0 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72  hen upgrading fr
16fe0 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58 43  om SHARED to EXC
16ff0 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63 68  LUSIVE.** (which
17000 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 68   occurs during h
17010 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
17020 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a  ack). Summary:.*
17030 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69 6f  *.**   Transitio
17040 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
17050 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b           | Invok
17060 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72 0a  es xBusyHandler.
17070 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
17080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
170a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
170b0 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20     NO_LOCK      
170c0 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20   -> SHARED_LOCK 
170d0 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20       | Yes.**   
170e0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e  SHARED_LOCK   ->
170f0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20   RESERVED_LOCK  
17100 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52    | No.**   SHAR
17110 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43  ED_LOCK   -> EXC
17120 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20  LUSIVE_LOCK   | 
17130 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45 44  No.**   RESERVED
17140 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49  _LOCK -> EXCLUSI
17150 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a  VE_LOCK   | Yes.
17160 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75 73  **.** If the bus
17170 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y-handler callba
17180 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  ck returns non-z
17190 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73  ero, the lock is
171a0 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49 66   .** retried. If
171b0 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f   it returns zero
171c0 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49 54  , then the SQLIT
171d0 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73 0a  E_BUSY error is.
171e0 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  ** returned to t
171f0 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 65  he caller of the
17200 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74   pager API funct
17210 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
17220 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
17230 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65 72  handler(.  Pager
17240 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
17250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17260 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
17270 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  */.  int (*xBusy
17280 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a 29  Handler)(void *)
17290 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ,         /* Poi
172a0 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61 6e  nter to busy-han
172b0 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  dler function */
172c0 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61  .  void *pBusyHa
172d0 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20 20 20  ndlerArg        
172e0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
172f0 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78  ent to pass to x
17300 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29  BusyHandler */.)
17310 7b 20 20 0a 20 20 70 50 61 67 65 72 2d 3e 78 42  {  .  pPager->xB
17320 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75  usyHandler = xBu
17330 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61  syHandler;.  pPa
17340 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
17350 72 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64  rArg = pBusyHand
17360 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lerArg;.}../*.**
17370 20 53 65 74 20 74 68 65 20 72 65 69 6e 69 74 69   Set the reiniti
17380 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20  alizer for this 
17390 70 61 67 65 72 2e 20 49 66 20 6e 6f 74 20 4e 55  pager. If not NU
173a0 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61  LL, the reinitia
173b0 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c  lizer.** is call
173c0 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74  ed when the cont
173d0 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ent of a page in
173e0 20 63 61 63 68 65 20 69 73 20 6d 6f 64 69 66 69   cache is modifi
173f0 65 64 20 28 72 65 73 74 6f 72 65 64 29 0a 2a 2a  ed (restored).**
17400 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 74 72   as part of a tr
17410 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73 61 76  ansaction or sav
17420 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e  epoint rollback.
17430 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69   The callback gi
17440 76 65 73 20 0a 2a 2a 20 68 69 67 68 65 72 2d 6c  ves .** higher-l
17450 65 76 65 6c 20 63 6f 64 65 20 61 6e 20 6f 70 70  evel code an opp
17460 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65 73 74  ortunity to rest
17470 6f 72 65 20 74 68 65 20 45 58 54 52 41 20 73 65  ore the EXTRA se
17480 63 74 69 6f 6e 20 74 6f 20 0a 2a 2a 20 61 67 72  ction to .** agr
17490 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ee with the rest
174a0 6f 72 65 64 20 70 61 67 65 20 64 61 74 61 2e 0a  ored page data..
174b0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
174c0 61 67 65 72 53 65 74 52 65 69 6e 69 74 65 72 28  agerSetReiniter(
174d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76  Pager *pPager, v
174e0 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44  oid (*xReinit)(D
174f0 62 50 61 67 65 2a 29 29 7b 0a 20 20 70 50 61 67  bPage*)){.  pPag
17500 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20  er->xReiniter = 
17510 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  xReinit;.}../*.*
17520 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75 72  * Report the cur
17530 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61  rent page size a
17540 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  nd number of res
17550 65 72 76 65 64 20 62 79 74 65 73 20 62 61 63 6b  erved bytes back
17560 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63  .** to the codec
17570 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
17580 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61  TE_HAS_CODEC.sta
17590 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65  tic void pagerRe
175a0 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a  portSize(Pager *
175b0 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
175c0 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a  Pager->xCodecSiz
175d0 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61  eChng ){.    pPa
175e0 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43  ger->xCodecSizeC
175f0 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64  hng(pPager->pCod
17600 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ec, pPager->page
17610 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
17620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17630 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52   (int)pPager->nR
17640 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23  eserve);.  }.}.#
17650 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
17660 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29  gerReportSize(X)
17670 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66       /* No-op if
17680 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f   we do not suppo
17690 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65  rt a codec */.#e
176a0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  ndif../*.** Chan
176b0 67 65 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  ge the page size
176c0 20 75 73 65 64 20 62 79 20 74 68 65 20 50 61 67   used by the Pag
176d0 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e  er object. The n
176e0 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a  ew page size .**
176f0 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70   is passed in *p
17700 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  PageSize..**.** 
17710 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
17720 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
17730 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
17740 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
17750 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f   it.** is a no-o
17760 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  p. The value ret
17770 75 72 6e 65 64 20 69 73 20 74 68 65 20 65 72 72  urned is the err
17780 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63  or state error c
17790 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e  ode (i.e. .** on
177a0 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52  e of SQLITE_IOER
177b0 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  R, SQLITE_CORRUP
177c0 54 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  T or SQLITE_FULL
177d0 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
177e0 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  se, if all of th
177f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
17800 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  true:.**.**   * 
17810 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a  the new page siz
17820 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61  e (value of *pPa
17830 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64  geSize) is valid
17840 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20   (a power .**   
17850 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e    of two between
17860 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f   512 and SQLITE_
17870 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69  MAX_PAGE_SIZE, i
17880 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a  nclusive), and.*
17890 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61  *.**   * there a
178a0 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
178b0 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  g page reference
178c0 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a  s, and.**.**   *
178d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
178e0 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69   either not an i
178f0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
17900 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20  e or it is.**   
17910 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    an in-memory d
17920 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75 72  atabase that cur
17930 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20  rently consists 
17940 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a  of zero pages..*
17950 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61  *.** then the pa
17960 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20  ger object page 
17970 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a  size is set to *
17980 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
17990 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
179a0 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68  e is changed, th
179b0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
179c0 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61 67   uses sqlite3Pag
179d0 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74  erMalloc() .** t
179e0 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50  o obtain a new P
179f0 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62  ager.pTmpSpace b
17a00 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20 61  uffer. If this a
17a10 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70  llocation attemp
17a20 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  t .** fails, SQL
17a30 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
17a40 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61  urned and the pa
17a50 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20  ge size remains 
17a60 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49  unchanged. .** I
17a70 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65  n all other case
17a80 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  s, SQLITE_OK is 
17a90 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
17aa0 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  If the page size
17ab0 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c   is not changed,
17ac0 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
17ad0 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65  one of the enume
17ae0 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69  rated.** conditi
17af0 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74  ons above is not
17b00 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65 72   true, the pager
17b10 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74   was in error st
17b20 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a  ate when this.**
17b30 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
17b40 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65  lled, or because
17b50 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
17b60 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66  cation attempt f
17b70 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20  ailed, .** then 
17b80 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73 65  *pPageSize is se
17b90 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65  t to the old, re
17ba0 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  tained page size
17bb0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
17bc0 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
17bd0 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
17be0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
17bf0 20 75 31 36 20 2a 70 50 61 67 65 53 69 7a 65 2c   u16 *pPageSize,
17c00 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a   int nReserve){.
17c10 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65    int rc = pPage
17c20 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69 66  r->errCode;.  if
17c30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17c40 29 7b 0a 20 20 20 20 75 31 36 20 70 61 67 65 53  ){.    u16 pageS
17c50 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65  ize = *pPageSize
17c60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61  ;.    assert( pa
17c70 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61  geSize==0 || (pa
17c80 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
17c90 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
17ca0 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29  MAX_PAGE_SIZE) )
17cb0 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 53 69  ;.    if( pageSi
17cc0 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d  ze && pageSize!=
17cd0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
17ce0 20 0a 20 20 20 20 20 26 26 20 28 70 50 61 67 65   .     && (pPage
17cf0 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70  r->memDb==0 || p
17d00 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30  Pager->dbSize==0
17d10 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  ).     && sqlite
17d20 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
17d30 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
17d40 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  ==0 .    ){.    
17d50 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 28    char *pNew = (
17d60 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61  char *)sqlite3Pa
17d70 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a  geMalloc(pageSiz
17d80 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  e);.      if( !p
17d90 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72  New ){.        r
17da0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
17db0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
17dc0 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
17dd0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
17de0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
17df0 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
17e00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17e10 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d  PageFree(pPager-
17e20 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20  >pTmpSpace);.   
17e30 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d       pPager->pTm
17e40 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20  pSpace = pNew;. 
17e50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63         sqlite3Pc
17e60 61 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28  acheSetPageSize(
17e70 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
17e80 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20   pageSize);.    
17e90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70    }.    }.    *p
17ea0 50 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29  PageSize = (u16)
17eb0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
17ec0 3b 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65 72  ;.    if( nReser
17ed0 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20  ve<0 ) nReserve 
17ee0 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72  = pPager->nReser
17ef0 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ve;.    assert( 
17f00 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e  nReserve>=0 && n
17f10 52 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a  Reserve<1000 );.
17f20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73      pPager->nRes
17f30 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73  erve = (i16)nRes
17f40 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52  erve;.    pagerR
17f50 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72  eportSize(pPager
17f60 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
17f70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
17f80 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
17f90 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20   the "temporary 
17fa0 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c  page" buffer hel
17fb0 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  d internally.** 
17fc0 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54  by the pager.  T
17fd0 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20  his is a buffer 
17fe0 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75  that is big enou
17ff0 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a  gh to hold the.*
18000 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  * entire content
18010 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70   of a database p
18020 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65  age.  This buffe
18030 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e  r is used intern
18040 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72  ally.** during r
18050 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c  ollback and will
18060 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
18070 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62  whenever a rollb
18080 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20  ack.** occurs.  
18090 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65  But other module
180a0 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73  s are free to us
180b0 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e  e it too, as lon
180c0 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62  g as.** no rollb
180d0 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69  acks are happeni
180e0 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ng..*/.void *sql
180f0 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
18100 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ce(Pager *pPager
18110 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
18120 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d  er->pTmpSpace;.}
18130 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
18140 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d  to set the maxim
18150 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65  um database page
18160 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65   count if mxPage
18170 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a   is positive. .*
18180 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  * Make no change
18190 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a  s if mxPage is z
181a0 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  ero or negative.
181b0 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75    And never redu
181c0 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75  ce the.** maximu
181d0 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c  m page count bel
181e0 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ow the current s
181f0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
18200 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72  ase..**.** Regar
18210 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c  dless of mxPage,
18220 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   return the curr
18230 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  ent maximum page
18240 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
18250 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
18260 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  geCount(Pager *p
18270 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
18280 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65  e){.  if( mxPage
18290 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  >0 ){.    pPager
182a0 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67  ->mxPgno = mxPag
182b0 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  e;.  }.  sqlite3
182c0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
182d0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 72 65 74  Pager, 0);.  ret
182e0 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  urn pPager->mxPg
182f0 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  no;.}../*.** The
18300 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f   following set o
18310 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  f routines are u
18320 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  sed to disable t
18330 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  he simulated.** 
18340 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e  I/O error mechan
18350 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74  ism.  These rout
18360 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
18370 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64   avoid simulated
18380 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c  .** errors in pl
18390 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f  aces where we do
183a0 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
183b0 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e  errors..**.** Un
183c0 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45  less -DSQLITE_TE
183d0 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68  ST=1 is used, th
183e0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
183f0 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61   all no-ops.** a
18400 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63  nd generate no c
18410 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ode..*/.#ifdef S
18420 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72  QLITE_TEST.exter
18430 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
18440 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
18450 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
18460 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b  e3_io_error_hit;
18470 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
18480 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61  d_cnt;.void disa
18490 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
184a0 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
184b0 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c   saved_cnt = sql
184c0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
184d0 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33  nding;.  sqlite3
184e0 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
184f0 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65  g = -1;.}.void e
18500 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
18510 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
18520 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
18530 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61  ror_pending = sa
18540 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65  ved_cnt;.}.#else
18550 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c  .# define disabl
18560 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
18570 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65  rrors().# define
18580 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
18590 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65  d_io_errors().#e
185a0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
185b0 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74   the first N byt
185c0 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  es from the begi
185d0 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c  nning of the fil
185e0 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a  e into memory.**
185f0 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e   that pDest poin
18600 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ts to. .**.** If
18610 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 6f   the pager was o
18620 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e 73  pened on a trans
18630 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c 65  ient file (zFile
18640 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a  name==""), or.**
18650 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c   opened on a fil
18660 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62 79  e less than N by
18670 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65  tes in size, the
18680 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
18690 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20  s.** zeroed and 
186a0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
186b0 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c  ed. The rational
186c0 65 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68  e for this is th
186d0 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  at this .** func
186e0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
186f0 72 65 61 64 20 64 61 74 61 62 61 73 65 20 68 65  read database he
18700 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77  aders, and a new
18710 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a   transient or.**
18720 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61   zero sized data
18730 62 61 73 65 20 68 61 73 20 61 20 68 65 61 64 65  base has a heade
18740 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20  r than consists 
18750 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f  entirely of zero
18760 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  es..**.** If any
18770 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74 20   IO error apart 
18780 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52  from SQLITE_IOER
18790 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73 20  R_SHORT_READ is 
187a0 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20  encountered,.** 
187b0 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
187c0 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
187d0 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68 65  e caller and the
187e0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
187f0 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65  .** output buffe
18800 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  r undefined..*/.
18810 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
18820 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 50  ReadFileheader(P
18830 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
18840 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  t N, unsigned ch
18850 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e  ar *pDest){.  in
18860 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
18870 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74  ;.  memset(pDest
18880 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72  , 0, N);.  asser
18890 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
188a0 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
188b0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 69  >tempFile );.  i
188c0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
188d0 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54  ->fd) ){.    IOT
188e0 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20  RACE(("DBHDR %p 
188f0 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  0 %d\n", pPager,
18900 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71   N)).    rc = sq
18910 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
18920 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e  er->fd, pDest, N
18930 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
18940 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
18950 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
18960 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
18970 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
18980 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
18990 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f  ** Return the to
189a0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
189b0 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
189c0 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61  ase file associa
189d0 74 65 64 20 0a 2a 2a 20 77 69 74 68 20 70 50 61  ted .** with pPa
189e0 67 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74  ger. Normally, t
189f0 68 69 73 20 69 73 20 63 61 6c 63 75 6c 61 74 65  his is calculate
18a00 64 20 61 73 20 28 3c 64 62 20 66 69 6c 65 20 73  d as (<db file s
18a10 69 7a 65 3e 2f 3c 70 61 67 65 2d 73 69 7a 65 3e  ize>/<page-size>
18a20 29 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69  )..** However, i
18a30 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 62 65  f the file is be
18a40 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70 61 67  tween 1 and <pag
18a50 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20 69 6e  e-size> bytes in
18a60 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20   size, then .** 
18a70 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64 65 72  this is consider
18a80 65 64 20 61 20 31 20 70 61 67 65 20 66 69 6c 65  ed a 1 page file
18a90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
18aa0 61 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f 72  ager is in error
18ab0 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
18ac0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
18ad0 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  led, then the.**
18ae0 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72   error state err
18af0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
18b00 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20  ned and *pnPage 
18b10 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 20  left unchanged. 
18b20 4f 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 66 69  Or,.** if the fi
18b30 6c 65 20 73 79 73 74 65 6d 20 68 61 73 20 74 6f  le system has to
18b40 20 62 65 20 71 75 65 72 69 65 64 20 66 6f 72 20   be queried for 
18b50 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
18b60 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20  file and.** the 
18b70 71 75 65 72 79 20 61 74 74 65 6d 70 74 20 72 65  query attempt re
18b80 74 75 72 6e 73 20 61 6e 20 49 4f 20 65 72 72 6f  turns an IO erro
18b90 72 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  r, the IO error 
18ba0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
18bb0 0a 2a 2a 20 61 6e 64 20 2a 70 6e 50 61 67 65 20  .** and *pnPage 
18bc0 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  is left unchange
18bd0 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  d..**.** Otherwi
18be0 73 65 2c 20 69 66 20 65 76 65 72 79 74 68 69 6e  se, if everythin
18bf0 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
18c00 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   then SQLITE_OK 
18c10 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
18c20 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 73 65  nd *pnPage is se
18c30 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
18c40 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
18c50 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74  database..*/.int
18c60 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
18c70 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
18c80 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67  ager, int *pnPag
18c90 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65  e){.  Pgno nPage
18ca0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18cb0 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
18cc0 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a  rn via *pnPage *
18cd0 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  /..  /* If the p
18ce0 61 67 65 72 20 69 73 20 61 6c 72 65 61 64 79 20  ager is already 
18cf0 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
18d00 74 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65  te, return the e
18d10 72 72 6f 72 20 63 6f 64 65 2e 20 2a 2f 0a 20 20  rror code. */.  
18d20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
18d30 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ode ){.    retur
18d40 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
18d50 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74  e;.  }..  /* Det
18d60 65 72 6d 69 6e 65 20 74 68 65 20 6e 75 6d 62 65  ermine the numbe
18d70 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
18d80 65 20 66 69 6c 65 2e 20 53 74 6f 72 65 20 74 68  e file. Store th
18d90 69 73 20 69 6e 20 6e 50 61 67 65 2e 20 2a 2f 0a  is in nPage. */.
18da0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
18db0 53 69 7a 65 56 61 6c 69 64 20 29 7b 0a 20 20 20  SizeValid ){.   
18dc0 20 6e 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d   nPage = pPager-
18dd0 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65  >dbSize;.  }else
18de0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20  {.    int rc;   
18df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18e00 20 45 72 72 6f 72 20 72 65 74 75 72 6e 65 64 20   Error returned 
18e10 62 79 20 4f 73 46 69 6c 65 53 69 7a 65 28 29 20  by OsFileSize() 
18e20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30  */.    i64 n = 0
18e30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
18e40 2a 20 46 69 6c 65 20 73 69 7a 65 20 69 6e 20 62  * File size in b
18e50 79 74 65 73 20 72 65 74 75 72 6e 65 64 20 62 79  ytes returned by
18e60 20 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f   OsFileSize() */
18e70 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ..    assert( is
18e80 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
18e90 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
18ea0 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20  File );.    if( 
18eb0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
18ec0 64 29 20 26 26 20 28 30 20 21 3d 20 28 72 63 20  d) && (0 != (rc 
18ed0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
18ee0 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
18ef0 26 6e 29 29 29 20 29 7b 0a 20 20 20 20 20 20 70  &n))) ){.      p
18f00 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
18f10 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 72 65  r, rc);.      re
18f20 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
18f30 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c     if( n>0 && n<
18f40 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
18f50 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
18f60 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
18f70 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50        nPage = (P
18f80 67 6e 6f 29 28 6e 20 2f 20 70 50 61 67 65 72 2d  gno)(n / pPager-
18f90 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
18fa0 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
18fb0 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
18fc0 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70  NLOCK ){.      p
18fd0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
18fe0 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 70 50 61  nPage;.      pPa
18ff0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
19000 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 70  = nPage;.      p
19010 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
19020 69 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  id = 1;.    }.  
19030 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  }..  /* If the c
19040 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66  urrent number of
19050 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69   pages in the fi
19060 6c 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68  le is greater th
19070 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f 6e  an the .  ** con
19080 66 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20  figured maximum 
19090 70 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e  pager number, in
190a0 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77  crease the allow
190b0 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a  ed limit so.  **
190c0 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 63   that the file c
190d0 61 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f  an be read..  */
190e0 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61  .  if( nPage>pPa
190f0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
19100 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
19110 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b  o = (Pgno)nPage;
19120 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
19130 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  he output variab
19140 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  le and return SQ
19150 4c 49 54 45 5f 4f 4b 20 2a 2f 0a 20 20 69 66 28  LITE_OK */.  if(
19160 20 70 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 2a   pnPage ){.    *
19170 70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  pnPage = nPage;.
19180 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
19190 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
191a0 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
191b0 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c  a lock of type l
191c0 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64  ocktype on the d
191d0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
191e0 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72  .** a similar or
191f0 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73   greater lock is
19200 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74   already held, t
19210 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
19220 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75  a no-op.** (retu
19230 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20  rning SQLITE_OK 
19240 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a  immediately)..**
19250 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
19260 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e  ttempt to obtain
19270 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
19280 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e  sqlite3OsLock().
19290 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20   Invoke .** the 
192a0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
192b0 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72   the lock is cur
192c0 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c  rently not avail
192d0 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a  able. Repeat .**
192e0 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20   until the busy 
192f0 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
19300 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20   false or until 
19310 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a  the attempt to .
19320 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  ** obtain the lo
19330 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a  ck succeeds..**.
19340 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
19350 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61  _OK on success a
19360 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
19370 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62   if we cannot ob
19380 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  tain.** the lock
19390 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  . If the lock is
193a0 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73   obtained succes
193b0 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20  sfully, set the 
193c0 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20  Pager.state .** 
193d0 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  variable to lock
193e0 74 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75  type before retu
193f0 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
19400 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f   int pager_wait_
19410 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  on_lock(Pager *p
19420 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74  Pager, int lockt
19430 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ype){.  int rc; 
19440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19450 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19460 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
19470 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b    /* The OS lock
19480 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20   values must be 
19490 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
194a0 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65  Pager lock value
194b0 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 50  s */.  assert( P
194c0 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41  AGER_SHARED==SHA
194d0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
194e0 73 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45  sert( PAGER_RESE
194f0 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c  RVED==RESERVED_L
19500 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
19510 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
19520 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
19530 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
19540 20 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74   file is current
19550 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e  ly unlocked then
19560 20 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20 62   the size must b
19570 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61  e unknown */.  a
19580 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
19590 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
195a0 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  ED || pPager->db
195b0 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a  SizeValid==0 );.
195c0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
195d0 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20   this is either 
195e0 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65  a no-op (because
195f0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
19600 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72  ock is .  ** alr
19610 65 61 64 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e  eady held, or on
19620 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 73  e of the transis
19630 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62  tions that the b
19640 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a  usy-handler.  **
19650 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20   may be invoked 
19660 64 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e  during, accordin
19670 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74  g to the comment
19680 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69   above.  ** sqli
19690 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
196a0 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20  andler()..  */. 
196b0 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
196c0 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70  ->state>=locktyp
196d0 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50  e).       || (pP
196e0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
196f0 45 52 5f 55 4e 4c 4f 43 4b 20 26 26 20 6c 6f 63  ER_UNLOCK && loc
19700 6b 74 79 70 65 3d 3d 50 41 47 45 52 5f 53 48 41  ktype==PAGER_SHA
19710 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  RED).       || (
19720 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
19730 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 26 26  AGER_RESERVED &&
19740 20 6c 6f 63 6b 74 79 70 65 3d 3d 50 41 47 45 52   locktype==PAGER
19750 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 29 3b  _EXCLUSIVE).  );
19760 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
19770 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20  state>=locktype 
19780 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
19790 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
197a0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72      do {.      r
197b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
197c0 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f  k(pPager->fd, lo
197d0 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68  cktype);.    }wh
197e0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
197f0 42 55 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e  BUSY && pPager->
19800 78 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61  xBusyHandler(pPa
19810 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
19820 72 41 72 67 29 20 29 3b 0a 20 20 20 20 69 66 28  rArg) );.    if(
19830 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19840 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
19850 73 74 61 74 65 20 3d 20 28 75 38 29 6c 6f 63 6b  state = (u8)lock
19860 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f 54 52  type;.      IOTR
19870 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64  ACE(("LOCK %p %d
19880 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63  \n", pPager, loc
19890 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a 20 20  ktype)).    }.  
198a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
198b0 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
198c0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   the in-memory d
198d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61  atabase file ima
198e0 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65  ge to nPage page
198f0 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  s. This .** func
19900 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63  tion does not ac
19910 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68  tually modify th
19920 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
19930 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20  on disk. It .** 
19940 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69 6e  just sets the in
19950 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20  ternal state of 
19960 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
19970 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a   so that the .**
19980 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c   truncation will
19990 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68   be done when th
199a0 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
199b0 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
199c0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
199d0 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
199e0 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  Image(Pager *pPa
199f0 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
19a00 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
19a10 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
19a20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
19a30 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61  ger->dbSize>=nPa
19a40 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
19a50 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
19a60 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
19a70 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
19a80 65 20 3d 20 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a  e = nPage;.}../*
19a90 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
19aa0 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72   page cache.  Fr
19ab0 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e  ee all memory an
19ac0 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65  d close all file
19ad0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72  s..**.** If a tr
19ae0 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e  ansaction was in
19af0 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74   progress when t
19b00 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
19b10 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74  alled, that.** t
19b20 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
19b30 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20  lled back.  All 
19b40 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
19b50 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
19b60 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d  d.** and their m
19b70 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20  emory is freed. 
19b80 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
19b90 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63  use a page assoc
19ba0 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
19bb0 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66  is page cache af
19bc0 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
19bd0 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c  n returns will l
19be0 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20  ikely.** result 
19bf0 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
19c00 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
19c10 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  on always succee
19c20 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  ds. If a transac
19c30 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
19c40 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20  n attempt.** is 
19c50 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20  made to roll it 
19c60 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f  back. If an erro
19c70 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
19c80 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a  the rollback .**
19c90 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d   a hot journal m
19ca0 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68  ay be left in th
19cb0 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74  e filesystem but
19cc0 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74   no error is ret
19cd0 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  urned.** to the 
19ce0 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  caller..*/.int s
19cf0 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
19d00 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
19d10 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  .  disable_simul
19d20 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
19d30 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
19d40 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
19d50 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
19d60 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
19d70 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
19d80 20 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73 65   0;.  pager_rese
19d90 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
19da0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 61   MEMDB ){.    pa
19db0 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
19dc0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
19dd0 20 2f 2a 20 53 65 74 20 50 61 67 65 72 2e 6a 6f   /* Set Pager.jo
19de0 75 72 6e 61 6c 48 64 72 20 74 6f 20 2d 31 20 66  urnalHdr to -1 f
19df0 6f 72 20 74 68 65 20 62 65 6e 65 66 69 74 20 6f  or the benefit o
19e00 66 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79  f the pager_play
19e10 62 61 63 6b 28 29 20 0a 20 20 20 20 2a 2a 20 63  back() .    ** c
19e20 61 6c 6c 20 77 68 69 63 68 20 6d 61 79 20 62 65  all which may be
19e30 20 6d 61 64 65 20 66 72 6f 6d 20 77 69 74 68 69   made from withi
19e40 6e 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64  n pagerUnlockAnd
19e50 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 49 66 20 69  Rollback(). If i
19e60 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  t.    ** is not 
19e70 2d 31 2c 20 74 68 65 6e 20 74 68 65 20 75 6e 73  -1, then the uns
19e80 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66  ynced portion of
19e90 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c   an open journal
19ea0 20 66 69 6c 65 20 6d 61 79 0a 20 20 20 20 2a 2a   file may.    **
19eb0 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
19ec0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
19ed0 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  e. If a power fa
19ee0 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69  ilure occurs whi
19ef0 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69  le.    ** this i
19f00 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68 65  s happening, the
19f10 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65   database may be
19f20 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20 20  come corrupt..  
19f30 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
19f40 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 2d 31  >journalHdr = -1
19f50 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  ;.    pagerUnloc
19f60 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
19f70 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
19f80 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
19f90 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73  oc();.  enable_s
19fa0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
19fb0 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41  rs();.  PAGERTRA
19fc0 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE(("CLOSE %d\n"
19fd0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
19fe0 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  )));.  IOTRACE((
19ff0 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50  "CLOSE %p\n", pP
1a000 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33  ager)).  sqlite3
1a010 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
1a020 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  fd);.  sqlite3Pa
1a030 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  geFree(pPager->p
1a040 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 73 71 6c  TmpSpace);.  sql
1a050 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28  ite3PcacheClose(
1a060 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
1a070 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
1a080 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28  _HAS_CODEC.  if(
1a090 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46   pPager->xCodecF
1a0a0 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43  ree ) pPager->xC
1a0b0 6f 64 65 63 46 72 65 65 28 70 50 61 67 65 72 2d  odecFree(pPager-
1a0c0 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66  >pCodec);.#endif
1a0d0 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
1a0e0 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20  ger->aSavepoint 
1a0f0 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a  && !pPager->pInJ
1a100 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
1a110 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  rt( !isOpen(pPag
1a120 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f  er->jfd) && !isO
1a130 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
1a140 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ) );..  sqlite3_
1a150 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  free(pPager);.  
1a160 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a170 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
1a180 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66  d(NDEBUG) || def
1a190 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
1a1a0 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
1a1b0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
1a1c0 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
1a1d0 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65  Pgno sqlite3Page
1a1e0 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61  rPagenumber(DbPa
1a1f0 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
1a200 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a  rn pPg->pgno;.}.
1a210 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
1a220 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
1a230 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
1a240 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69  page pPg..*/.voi
1a250 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  d sqlite3PagerRe
1a260 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
1a270 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
1a280 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ef(pPg);.}../*.*
1a290 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
1a2a0 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  al. In other wor
1a2b0 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  ds, make sure al
1a2c0 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74  l the pages that
1a2d0 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72   have.** been wr
1a2e0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
1a2f0 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c  rnal have actual
1a300 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73  ly reached the s
1a310 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a  urface of the.**
1a320 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 65   disk and can be
1a330 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68 65   restored in the
1a340 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d   event of a hot-
1a350 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
1a360 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
1a370 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  ager.needSync fl
1a380 61 67 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 74  ag is not set, t
1a390 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1a3a0 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e  n is a.** no-op.
1a3b0 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
1a3c0 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64  actions required
1a3d0 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a   depend on the j
1a3e0 6f 75 72 6e 61 6c 2d 6d 6f 64 65 0a 2a 2a 20 61  ournal-mode.** a
1a3f0 6e 64 20 74 68 65 20 64 65 76 69 63 65 20 63 68  nd the device ch
1a400 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f 66  aracteristics of
1a410 20 74 68 65 20 74 68 65 20 66 69 6c 65 2d 73 79   the the file-sy
1a420 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  stem, as follows
1a430 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74  :.**.**   * If t
1a440 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1a450 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
1a460 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f  journal file, no
1a470 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20   action need.** 
1a480 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a      be taken..**
1a490 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73  .**   * Otherwis
1a4a0 65 2c 20 69 66 20 74 68 65 20 64 65 76 69 63 65  e, if the device
1a4b0 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
1a4c0 74 20 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e  t the SAFE_APPEN
1a4d0 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20  D property,.**  
1a4e0 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63     then the nRec
1a4f0 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f   field of the mo
1a500 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74  st recently writ
1a510 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ten journal head
1a520 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64  er.**     is upd
1a530 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ated to contain 
1a540 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f  the number of jo
1a550 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68  urnal records th
1a560 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62  at have.**     b
1a570 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c  een written foll
1a580 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65  owing it. If the
1a590 20 70 61 67 65 72 20 69 73 20 6f 70 65 72 61 74   pager is operat
1a5a0 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63  ing in full-sync
1a5b0 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68  .**     mode, th
1a5c0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
1a5d0 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62 65  ile is synced be
1a5e0 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64 20  fore this field 
1a5f0 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a  is updated..**.*
1a600 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64 65 76  *   * If the dev
1a610 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ice does not sup
1a620 70 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e 54  port the SEQUENT
1a630 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68  IAL property, th
1a640 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  en .**     journ
1a650 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  al file is synce
1a660 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20  d..**.** Or, in 
1a670 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a  pseudo-code:.**.
1a680 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e  **   if( NOT <in
1a690 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e  -memory journal>
1a6a0 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e   ){.**     if( N
1a6b0 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29  OT SAFE_APPEND )
1a6c0 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c  {.**       if( <
1a6d0 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20  full-sync mode> 
1a6e0 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c  ) xSync(<journal
1a6f0 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20   file>);.**     
1a700 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66    <update nRec f
1a710 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a  ield>.**     } .
1a720 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53  **     if( NOT S
1a730 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e  EQUENTIAL ) xSyn
1a740 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e  c(<journal file>
1a750 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20  );.**   }.**.** 
1a760 54 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79  The Pager.needSy
1a770 6e 63 20 66 6c 61 67 20 69 73 20 6e 65 76 65 72  nc flag is never
1a780 20 62 65 20 73 65 74 20 66 6f 72 20 74 65 6d 70   be set for temp
1a790 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 6f 72 20  orary files, or 
1a7a0 61 6e 79 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 72  any.** file oper
1a7b0 61 74 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63  ating in no-sync
1a7c0 20 6d 6f 64 65 20 28 50 61 67 65 72 2e 6e 6f 53   mode (Pager.noS
1a7d0 79 6e 63 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a  ync set to non-z
1a7e0 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ero)..**.** If s
1a7f0 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20  uccessful, this 
1a800 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74  routine clears t
1a810 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
1a820 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79  NC flag of every
1a830 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e   .** page curren
1a840 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f  tly held in memo
1a850 72 79 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ry before return
1a860 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  ing SQLITE_OK. I
1a870 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72  f an IO.** error
1a880 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
1a890 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
1a8a0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1a8b0 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
1a8c0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1a8d0 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67   syncJournal(Pag
1a8e0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1a8f0 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  f( pPager->needS
1a900 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ync ){.    asser
1a910 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
1a920 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20  File );.    if( 
1a930 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
1a940 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
1a950 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b  ALMODE_MEMORY ){
1a960 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 20 20  .      int rc;  
1a970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1a990 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1a9a0 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44      const int iD
1a9b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
1a9c0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1a9d0 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
1a9e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
1a9f0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
1aa00 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  ) );..      if( 
1aa10 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
1aa20 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
1aa30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
1aa40 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73  This block deals
1aa50 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65   with an obscure
1aa60 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65   problem. If the
1aa70 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e   last connection
1aa80 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
1aa90 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64   wrote to this d
1aaa0 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65 72  atabase was oper
1aab0 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74  ating in persist
1aac0 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  ent-journal.    
1aad0 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65      ** mode, the
1aae0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
1aaf0 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20 70  le may at this p
1ab00 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65  oint actually be
1ab10 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20 20   larger.        
1ab20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f  ** than Pager.jo
1ab30 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20  urnalOff bytes. 
1ab40 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e  If the next thin
1ab50 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g in the journal
1ab60 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  .        ** file
1ab70 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61   happens to be a
1ab80 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
1ab90 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72 74  (written as part
1aba0 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
1abb0 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e  ** previous conn
1abc0 65 63 74 69 6f 6e 73 20 74 72 61 6e 73 61 63 74  ections transact
1abd0 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73  ion), and a cras
1abe0 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75  h or power-failu
1abf0 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  re .        ** o
1ac00 63 63 75 72 73 20 61 66 74 65 72 20 6e 52 65 63  ccurs after nRec
1ac10 20 69 73 20 75 70 64 61 74 65 64 20 62 75 74 20   is updated but 
1ac20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e  before this conn
1ac30 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20  ection writes . 
1ac40 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69         ** anythi
1ac50 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a  ng else to the j
1ac60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20  ournal file (or 
1ac70 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61  commits/rolls ba
1ac80 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20 20  ck its .        
1ac90 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  ** transaction),
1aca0 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79   then SQLite may
1acb0 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64   become confused
1acc0 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20   when doing the 
1acd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d  .        ** hot-
1ace0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
1acf0 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76   following recov
1ad00 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c  ery. It may roll
1ad10 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20   back all.      
1ad20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e    ** of this con
1ad30 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74  nections data, t
1ad40 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72  hen proceed to r
1ad50 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20  olling back the 
1ad60 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  old,.        ** 
1ad70 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61  out-of-date data
1ad80 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74   that follows it
1ad90 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75  . Database corru
1ada0 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  ption..        *
1adb0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20  *.        ** To 
1adc0 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
1add0 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  , if the journal
1ade0 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61   file does appea
1adf0 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20  r to contain.   
1ae00 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20       ** a valid 
1ae10 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67  header following
1ae20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
1ae30 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20  f, then write a 
1ae40 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20  0x00.        ** 
1ae50 62 79 74 65 20 74 6f 20 74 68 65 20 73 74 61 72  byte to the star
1ae60 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65  t of it to preve
1ae70 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67  nt it from being
1ae80 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20   recognized..   
1ae90 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
1aea0 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78  ** Variable iNex
1aeb0 74 48 64 72 4f 66 66 73 65 74 20 69 73 20 73 65  tHdrOffset is se
1aec0 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  t to the offset 
1aed0 61 74 20 77 68 69 63 68 20 74 68 69 73 0a 20 20  at which this.  
1aee0 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d        ** problem
1aef0 61 74 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c  atic header will
1af00 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65 78   occur, if it ex
1af10 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20  ists. aMagic is 
1af20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a  used .        **
1af30 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   as a temporary 
1af40 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63  buffer to inspec
1af50 74 20 74 68 65 20 66 69 72 73 74 20 63 6f 75 70  t the first coup
1af60 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20  le of bytes of. 
1af70 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f         ** the po
1af80 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20  tential journal 
1af90 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20  header..        
1afa0 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  */.        i64 i
1afb0 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b 0a 20  NextHdrOffset;. 
1afc0 20 20 20 20 20 20 20 75 38 20 61 4d 61 67 69 63         u8 aMagic
1afd0 5b 38 5d 3b 0a 09 75 38 20 7a 48 65 61 64 65 72  [8];..u8 zHeader
1afe0 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
1aff0 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 09 6d 65 6d  Magic)+4];...mem
1b000 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
1b010 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
1b020 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
1b030 29 29 3b 0a 09 70 75 74 33 32 62 69 74 73 28 26  ));..put32bits(&
1b040 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
1b050 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
1b060 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a  pPager->nRec);..
1b070 20 20 20 20 20 20 20 20 69 4e 65 78 74 48 64 72          iNextHdr
1b080 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c  Offset = journal
1b090 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72  HdrOffset(pPager
1b0a0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1b0b0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
1b0c0 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
1b0d0 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72 4f 66  c, 8, iNextHdrOf
1b0e0 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69  fset);.        i
1b0f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b100 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d   && 0==memcmp(aM
1b110 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
1b120 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20  gic, 8) ){.     
1b130 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
1b140 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20  t u8 zerobyte = 
1b150 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
1b160 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1b170 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a  (pPager->jfd, &z
1b180 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65 78  erobyte, 1, iNex
1b190 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20  tHdrOffset);.   
1b1a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1b1b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b1c0 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49   && rc!=SQLITE_I
1b1d0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
1b1e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
1b1f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1b200 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72  }..        /* Wr
1b210 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  ite the nRec val
1b220 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ue into the jour
1b230 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e  nal file header.
1b240 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a   If in.        *
1b250 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f  * full-synchrono
1b260 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68  us mode, sync th
1b270 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e  e journal first.
1b280 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
1b290 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  at.        ** al
1b2a0 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c  l data has reall
1b2b0 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62  y hit the disk b
1b2c0 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70  efore nRec is up
1b2d0 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20  dated to mark.  
1b2e0 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61        ** it as a
1b2f0 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72   candidate for r
1b300 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ollback..       
1b310 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
1b320 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
1b330 72 65 64 20 69 66 20 74 68 65 20 70 65 72 73 69  red if the persi
1b340 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70  stent media supp
1b350 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20 20 20  orts the.       
1b360 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20   ** SAFE_APPEND 
1b370 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73  property. Becaus
1b380 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69  e in this case i
1b390 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
1b3a0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  e .        ** fo
1b3b0 72 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  r garbage data t
1b3c0 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f  o be appended to
1b3d0 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e   the file, the n
1b3e0 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20  Rec field.      
1b3f0 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65    ** is populate
1b400 64 20 77 69 74 68 20 30 78 46 46 46 46 46 46 46  d with 0xFFFFFFF
1b410 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  F when the journ
1b420 61 6c 20 68 65 61 64 65 72 20 69 73 20 77 72 69  al header is wri
1b430 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tten.        ** 
1b440 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20  and never needs 
1b450 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20  to be updated.. 
1b460 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1b470 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
1b480 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44  llSync && 0==(iD
1b490 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
1b4a0 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
1b4b0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1b4c0 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
1b4d0 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
1b4e0 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
1b4f0 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45           IOTRACE
1b500 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20  (("JSYNC %p\n", 
1b510 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20  pPager)).       
1b520 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1b530 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
1b540 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
1b550 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20  flags);.        
1b560 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b570 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1b580 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b590 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
1b5a0 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50  R %p %lld\n", pP
1b5b0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
1b5c0 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20 20  urnalHdr));.    
1b5d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b5e0 4f 73 57 72 69 74 65 28 0a 20 20 20 20 20 20 20  OsWrite(.       
1b5f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64       pPager->jfd
1b600 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  , zHeader, sizeo
1b610 66 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61 67  f(zHeader), pPag
1b620 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 09  er->journalHdr..
1b630 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1b640 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1b650 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1b660 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  }.      if( 0==(
1b670 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
1b680 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
1b690 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1b6a0 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
1b6b0 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
1b6c0 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
1b6d0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
1b6e0 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
1b6f0 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72  ager)).        r
1b700 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
1b710 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
1b720 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
1b730 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70  s| .          (p
1b740 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
1b750 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  s==SQLITE_SYNC_F
1b760 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ULL?SQLITE_SYNC_
1b770 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20  DATAONLY:0).    
1b780 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1b790 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b7a0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1b7b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1b7c0 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   /* The journal 
1b7d0 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 73 75  file was just su
1b7e0 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65  ccessfully synce
1b7f0 64 2e 20 53 65 74 20 50 61 67 65 72 2e 6e 65 65  d. Set Pager.nee
1b800 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 74 6f  dSync .    ** to
1b810 20 7a 65 72 6f 20 61 6e 64 20 63 6c 65 61 72 20   zero and clear 
1b820 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
1b830 59 4e 43 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 20  YNC flag on all 
1b840 70 61 67 65 73 73 2e 0a 20 20 20 20 2a 2f 0a 20  pagess..    */. 
1b850 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
1b860 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ync = 0;.    pPa
1b870 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
1b880 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c  ted = 1;.    sql
1b890 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 53  ite3PcacheClearS
1b8a0 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d  yncFlags(pPager-
1b8b0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a  >pPCache);.  }..
1b8c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b8d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
1b8e0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
1b8f0 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b   first in a link
1b900 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79  ed list of dirty
1b910 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64   pages connected
1b920 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72  .** by the PgHdr
1b930 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e  .pDirty pointer.
1b940 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
1b950 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f  rites each one o
1b960 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  f the.** in-memo
1b970 72 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ry pages in the 
1b980 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61  list to the data
1b990 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61  base file. The a
1b9a0 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62  rgument may.** b
1b9b0 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e  e NULL, represen
1b9c0 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69  ting an empty li
1b9d0 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  st. In this case
1b9e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1b9f0 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s.** a no-op..**
1ba00 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75  .** The pager mu
1ba10 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  st hold at least
1ba20 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
1ba30 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
1ba40 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ion.** is called
1ba50 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67  . Before writing
1ba60 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65   anything to the
1ba70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
1ba80 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20  this lock.** is 
1ba90 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45  upgraded to an E
1baa0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
1bab0 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f  f the lock canno
1bac0 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a  t be obtained,.*
1bad0 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
1bae0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f   returned and no
1baf0 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
1bb00 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1bb10 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66   file..** .** If
1bb20 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20   the pager is a 
1bb30 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20  temp-file pager 
1bb40 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66  and the actual f
1bb50 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a  ile-system file.
1bb60 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70  ** is not yet op
1bb70 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65  en, it is create
1bb80 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66  d and opened bef
1bb90 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
1bba0 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e  .** written out.
1bbb0 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20  .**.** Once the 
1bbc0 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70  lock has been up
1bbd0 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e  graded and, if n
1bbe0 65 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69  ecessary, the fi
1bbf0 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68  le opened,.** th
1bc00 65 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74  e pages are writ
1bc10 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ten out to the d
1bc20 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
1bc30 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74  list order. Writ
1bc40 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73  ing.** a page is
1bc50 20 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d   skipped if it m
1bc60 65 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74  eets either of t
1bc70 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
1bc80 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  teria:.**.**   *
1bc90 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
1bca0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1bcb0 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f   Pager.dbSize, o
1bcc0 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48  r.**   * The PGH
1bcd0 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c  DR_DONT_WRITE fl
1bce0 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65  ag is set on the
1bcf0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
1bd00 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61  writing out a pa
1bd10 67 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61  ge causes the da
1bd20 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67  tabase file to g
1bd30 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c  row, Pager.dbFil
1bd40 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61  eSize.** is upda
1bd50 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
1bd60 20 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72   If page 1 is wr
1bd70 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20  itten out, then 
1bd80 74 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64  the value cached
1bd90 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46  .** in Pager.dbF
1bda0 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64  ileVers[] is upd
1bdb0 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68  ated to match th
1bdc0 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72  e new value stor
1bdd0 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74  ed in.** the dat
1bde0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
1bdf0 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
1be00 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
1be10 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1be20 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
1be30 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c  rror .** occurs,
1be40 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
1be50 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
1be60 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53  r, if the EXCLUS
1be70 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a  IVE lock cannot.
1be80 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20  ** be obtained, 
1be90 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
1bea0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1beb0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
1bec0 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64  te_pagelist(PgHd
1bed0 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67  r *pList){.  Pag
1bee0 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20  er *pPager;     
1bef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf00 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
1bf10 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  t */.  int rc;  
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 52              /* R
1bf40 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
1bf50 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
1bf60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1bf70 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69  ;.  pPager = pLi
1bf80 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f  st->pPager;..  /
1bf90 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
1bfa0 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 69 74  there may be eit
1bfb0 68 65 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  her a RESERVED o
1bfc0 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
1bfd0 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
1bfe0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
1bff0 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
1c000 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
1c010 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  k, the following
1c020 0a 20 20 2a 2a 20 63 61 6c 6c 20 69 73 20 61 20  .  ** call is a 
1c030 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  no-op..  **.  **
1c040 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b   Moving the lock
1c050 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74   from RESERVED t
1c060 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63 74 75  o EXCLUSIVE actu
1c070 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f  ally involves go
1c080 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68  ing.  ** through
1c090 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65   an intermediate
1c0a0 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20   state PENDING. 
1c0b0 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b    A PENDING lock
1c0c0 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20   prevents new.  
1c0d0 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20  ** readers from 
1c0e0 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65  attaching to the
1c0f0 20 64 61 74 61 62 61 73 65 20 62 75 74 20 69 73   database but is
1c100 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f   unsufficient fo
1c110 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69  r us to.  ** wri
1c120 74 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66  te.  The idea of
1c130 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
1c140 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65  is to prevent ne
1c150 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20  w readers from. 
1c160 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68   ** coming in wh
1c170 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72 20  ile we wait for 
1c180 65 78 69 73 74 69 6e 67 20 72 65 61 64 65 72 73  existing readers
1c190 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a   to clear..  **.
1c1a0 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70    ** While the p
1c1b0 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 52  ager is in the R
1c1c0 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
1c1d0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
1c1e0 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69  base file.  ** i
1c1f0 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  s unchanged and 
1c200 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20  we can rollback 
1c210 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
1c220 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20  o playback the. 
1c230 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f   ** journal into
1c240 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
1c250 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e  tabase file.  On
1c260 63 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e  ce we transition
1c270 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49   to.  ** EXCLUSI
1c280 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  VE, it means the
1c290 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
1c2a0 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20  as been changed 
1c2b0 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b  and any rollback
1c2c0 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69  .  ** will requi
1c2d0 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61  re a journal pla
1c2e0 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73  yback..  */.  as
1c2f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1c300 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
1c310 56 45 44 20 29 3b 0a 20 20 72 63 20 3d 20 70 61  VED );.  rc = pa
1c320 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
1c330 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
1c340 56 45 5f 4c 4f 43 4b 29 3b 0a 0a 20 20 2f 2a 20  VE_LOCK);..  /* 
1c350 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 61  If the file is a
1c360 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e   temp-file has n
1c370 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e  ot yet been open
1c380 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  ed, open it now.
1c390 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20   It.  ** is not 
1c3a0 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20  possible for rc 
1c3b0 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e  to be other than
1c3c0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
1c3d0 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69  is branch.  ** i
1c3e0 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65  s taken, as page
1c3f0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29  r_wait_on_lock()
1c400 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
1c410 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f  temp-files..  */
1c420 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
1c430 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
1c440 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1c450 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63  ->tempFile && rc
1c460 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
1c470 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65     rc = pagerOpe
1c480 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50  ntemp(pPager, pP
1c490 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
1c4a0 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d  ->vfsFlags);.  }
1c4b0 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ..  while( rc==S
1c4c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73  QLITE_OK && pLis
1c4d0 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  t ){.    Pgno pg
1c4e0 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  no = pList->pgno
1c4f0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
1c500 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67  re are dirty pag
1c510 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  es in the page c
1c520 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e  ache with page n
1c530 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20  umbers greater. 
1c540 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
1c550 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65  .dbSize, this me
1c560 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ans sqlite3Pager
1c570 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20  TruncateImage() 
1c580 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20  was called to.  
1c590 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69    ** make the fi
1c5a0 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73  le smaller (pres
1c5b0 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76  umably by auto-v
1c5c0 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20  acuum code). Do 
1c5d0 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a  not write.    **
1c5e0 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20   any such pages 
1c5f0 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  to the file..   
1c600 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c   **.    ** Also,
1c610 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75   do not write ou
1c620 74 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20  t any page that 
1c630 68 61 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f  has the PGHDR_DO
1c640 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20  NT_WRITE flag.  
1c650 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79    ** set (set by
1c660 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1c670 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a  tWrite())..    *
1c680 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d  /.    if( pgno<=
1c690 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26  pPager->dbSize &
1c6a0 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61  & 0==(pList->fla
1c6b0 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  gs&PGHDR_DONT_WR
1c6c0 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36  ITE) ){.      i6
1c6d0 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f  4 offset = (pgno
1c6e0 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
1c6f0 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20  >pageSize;   /* 
1c700 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20  Offset to write 
1c710 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  */.      char *p
1c720 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
1c730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c740 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
1c750 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a  to write */    .
1c760 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65  .      /* Encode
1c770 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
1c780 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50  .      CODEC2(pP
1c790 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61  ager, pList->pDa
1c7a0 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74  ta, pgno, 6, ret
1c7b0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1c7c0 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  , pData);..     
1c7d0 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68   /* Write out th
1c7e0 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a  e page data. */.
1c7f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1c800 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
1c810 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61  ->fd, pData, pPa
1c820 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
1c830 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f  ffset);..      /
1c840 2a 20 49 66 20 70 61 67 65 20 31 20 77 61 73 20  * If page 1 was 
1c850 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70  just written, up
1c860 64 61 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c  date Pager.dbFil
1c870 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20  eVers to match. 
1c880 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75       ** the valu
1c890 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20  e now stored in 
1c8a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c8b0 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74 68  e. If writing th
1c8c0 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  is .      ** pag
1c8d0 65 20 63 61 75 73 65 64 20 74 68 65 20 64 61 74  e caused the dat
1c8e0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
1c8f0 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c  ow, update dbFil
1c900 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f  eSize. .      */
1c910 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  .      if( pgno=
1c920 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =1 ){.        me
1c930 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
1c940 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61  FileVers, &pData
1c950 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61  [24], sizeof(pPa
1c960 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
1c970 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1c980 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
1c990 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a  ->dbFileSize ){.
1c9a0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1c9b0 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e  dbFileSize = pgn
1c9c0 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  o;.      }..    
1c9d0 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20    /* Update any 
1c9e0 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63  backup objects c
1c9f0 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  opying the conte
1ca00 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  nts of this page
1ca10 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  r. */.      sqli
1ca20 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
1ca30 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
1ca40 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73   pgno, (u8*)pLis
1ca50 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20  t->pData);..    
1ca60 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
1ca70 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20  TORE %d page %d 
1ca80 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
1ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1caa0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1cab0 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
1cac0 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29  agehash(pList)))
1cad0 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
1cae0 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22  ("PGOUT %p %d\n"
1caf0 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
1cb00 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
1cb10 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
1cb20 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b  _writedb_count);
1cb30 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
1cb40 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  R(pPager->nWrite
1cb50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1cb60 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
1cb70 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65  "NOSTORE %d page
1cb80 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1cb90 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b  pPager), pgno));
1cba0 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
1cbb0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
1cbc0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65  .    pList->page
1cbd0 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
1cbe0 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65  ehash(pList);.#e
1cbf0 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d  ndif.    pList =
1cc00 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
1cc10 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1cc20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
1cc30 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68  d a record of th
1cc40 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
1cc50 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f 20 74  of page pPg to t
1cc60 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
1cc70 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 63 61  .** It is the ca
1cc80 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69  llers responsibi
1cc90 6c 69 74 79 20 74 6f 20 75 73 65 20 73 75 62 6a  lity to use subj
1cca0 52 65 71 75 69 72 65 73 50 61 67 65 28 29 20 74  RequiresPage() t
1ccb0 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74  o check .** that
1ccc0 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65   it is really re
1ccd0 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 63 61  quired before ca
1cce0 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1ccf0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ion..**.** If su
1cd00 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
1cd10 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
1cd20 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f  ing to pPg->pgno
1cd30 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a   in the bitvecs.
1cd40 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20  ** for all open 
1cd50 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72  savepoints befor
1cd60 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
1cd70 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1cd80 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1cd90 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
1cda0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
1cdb0 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63  an IO.** error c
1cdc0 6f 64 65 20 69 66 20 74 68 65 20 61 74 74 65 6d  ode if the attem
1cdd0 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  pt to write to t
1cde0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
1cdf0 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c  ails, or .** SQL
1ce00 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
1ce10 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c  alloc fails whil
1ce20 65 20 73 65 74 74 69 6e 67 20 61 20 62 69 74 20  e setting a bit 
1ce30 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a  in a savepoint.*
1ce40 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61  * bitvec..*/.sta
1ce50 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e  tic int subjourn
1ce60 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  alPage(PgHdr *pP
1ce70 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
1ce80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1ce90 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1cea0 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 69  >pPager;.  if( i
1ceb0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
1cec0 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  fd) ){.    void 
1ced0 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44  *pData = pPg->pD
1cee0 61 74 61 3b 0a 20 20 20 20 69 36 34 20 6f 66 66  ata;.    i64 off
1cef0 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53  set = pPager->nS
1cf00 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
1cf10 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1cf20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20  char *pData2;.. 
1cf30 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
1cf40 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
1cf50 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51  no, 7, return SQ
1cf60 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74  LITE_NOMEM, pDat
1cf70 61 32 29 3b 0a 20 20 20 20 50 41 47 45 52 54 52  a2);.    PAGERTR
1cf80 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e  ACE(("STMT-JOURN
1cf90 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
1cfa0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1cfb0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  ), pPg->pgno));.
1cfc0 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70    .    assert( p
1cfd0 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67  ageInJournal(pPg
1cfe0 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70  ) || pPg->pgno>p
1cff0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
1d000 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 72  e );.    rc = wr
1d010 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
1d020 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20  ->sjfd, offset, 
1d030 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1d040 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d050 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1d060 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
1d070 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61  Pager->sjfd, pDa
1d080 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
1d090 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29  eSize, offset+4)
1d0a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1d0b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d0c0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
1d0d0 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73  SubRec++;.    as
1d0e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53  sert( pPager->nS
1d0f0 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20  avepoint>0 );.  
1d100 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65    rc = addToSave
1d110 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
1d120 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
1d130 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1d140 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1d150 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1d160 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
1d170 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1d180 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65  ed by the pcache
1d190 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68   layer when it h
1d1a0 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a  as reached some.
1d1b0 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c  ** soft memory l
1d1c0 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74 20  imit. The first 
1d1d0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
1d1e0 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
1d1f0 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74   object.** (cast
1d200 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68   as a void*). Th
1d210 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61 79  e pager is alway
1d220 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e  s 'purgeable' (n
1d230 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  ot an in-memory.
1d240 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54 68  ** database). Th
1d250 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1d260 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  t is a reference
1d270 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74 20   to a page that 
1d280 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  is .** currently
1d290 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20 6e   dirty but has n
1d2a0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
1d2b0 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61  ferences. The pa
1d2c0 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20  ge.** is always 
1d2d0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1d2e0 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
1d2f0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
1d300 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  irst .** argumen
1d310 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62  t..**.** The job
1d320 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
1d330 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67  n is to make pPg
1d340 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e   clean by writin
1d350 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a  g its contents.*
1d360 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  * out to the dat
1d370 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70  abase file, if p
1d380 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61  ossible. This ma
1d390 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e  y involve syncin
1d3a0 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  g the.** journal
1d3b0 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   file. .**.** If
1d3c0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c   successful, sql
1d3d0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
1d3e0 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ean() is called 
1d3f0 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a  on the page and.
1d400 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
1d410 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
1d420 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
1d430 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b  le trying to mak
1d440 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c  e the.** page cl
1d450 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  ean, the IO erro
1d460 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1d470 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ed. If the page 
1d480 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64  cannot be.** mad
1d490 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65  e clean for some
1d4a0 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62   other reason, b
1d4b0 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
1d4c0 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  rs, then SQLITE_
1d4d0 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
1d4e0 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63  d by sqlite3Pcac
1d4f0 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73  heMakeClean() is
1d500 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a   not called..*/.
1d510 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1d520 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20  Stress(void *p, 
1d530 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
1d540 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28  ager *pPager = (
1d550 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74  Pager *)p;.  int
1d560 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d570 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ..  assert( pPg-
1d580 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
1d590 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
1d5a0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
1d5b0 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  RTY );..  /* The
1d5c0 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20   doNotSync flag 
1d5d0 69 73 20 73 65 74 20 62 79 20 74 68 65 20 73 71  is set by the sq
1d5e0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1d5f0 29 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65  ) function while
1d600 20 69 74 0a 20 20 2a 2a 20 69 73 20 6a 6f 75 72   it.  ** is jour
1d610 6e 61 6c 6c 69 6e 67 20 61 20 73 65 74 20 6f 66  nalling a set of
1d620 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 64 61 74   two or more dat
1d630 61 62 61 73 65 20 70 61 67 65 73 20 74 68 61 74  abase pages that
1d640 20 61 72 65 20 73 74 6f 72 65 64 0a 20 20 2a 2a   are stored.  **
1d650 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 64 69 73   on the same dis
1d660 6b 20 73 65 63 74 6f 72 2e 20 53 79 6e 63 69 6e  k sector. Syncin
1d670 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  g the journal is
1d680 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 77 68 69   not allowed whi
1d690 6c 65 0a 20 20 2a 2a 20 74 68 69 73 20 69 73 20  le.  ** this is 
1d6a0 68 61 70 70 65 6e 69 6e 67 20 61 73 20 69 74 20  happening as it 
1d6b0 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  is important tha
1d6c0 74 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66  t all members of
1d6d0 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 65 74   such a.  ** set
1d6e0 20 6f 66 20 70 61 67 65 73 20 61 72 65 20 73 79   of pages are sy
1d6f0 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 74 6f 67  nced to disk tog
1d700 65 74 68 65 72 2e 20 53 6f 2c 20 69 66 20 74 68  ether. So, if th
1d710 65 20 70 61 67 65 20 74 68 69 73 20 66 75 6e 63  e page this func
1d720 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 72 79  tion.  ** is try
1d730 69 6e 67 20 74 6f 20 6d 61 6b 65 20 63 6c 65 61  ing to make clea
1d740 6e 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61  n will require a
1d750 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 61 6e   journal sync an
1d760 64 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 0a  d the doNotSync.
1d770 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74    ** flag is set
1d780 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  , return without
1d790 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e   doing anything.
1d7a0 20 54 68 65 20 70 63 61 63 68 65 20 6c 61 79 65   The pcache laye
1d7b0 72 20 77 69 6c 6c 0a 20 20 2a 2a 20 6a 75 73 74  r will.  ** just
1d7c0 20 68 61 76 65 20 74 6f 20 67 6f 20 61 68 65 61   have to go ahea
1d7d0 64 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 61  d and allocate a
1d7e0 20 6e 65 77 20 70 61 67 65 20 62 75 66 66 65 72   new page buffer
1d7f0 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 2a 2a   instead of.  **
1d800 20 72 65 75 73 69 6e 67 20 70 50 67 2e 0a 20 20   reusing pPg..  
1d810 2a 2a 0a 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c  **.  ** Similarl
1d820 79 2c 20 69 66 20 74 68 65 20 70 61 67 65 72 20  y, if the pager 
1d830 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65  has already ente
1d840 72 65 64 20 74 68 65 20 65 72 72 6f 72 20 73 74  red the error st
1d850 61 74 65 2c 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a  ate, do not.  **
1d860 20 74 72 79 20 74 6f 20 77 72 69 74 65 20 74 68   try to write th
1d870 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50  e contents of pP
1d880 67 20 74 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  g to disk..  */.
1d890 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
1d8a0 72 43 6f 64 65 20 7c 7c 20 28 70 50 61 67 65 72  rCode || (pPager
1d8b0 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 26 26 20 70  ->doNotSync && p
1d8c0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
1d8d0 4e 45 45 44 5f 53 59 4e 43 29 20 29 7b 0a 20 20  NEED_SYNC) ){.  
1d8e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d8f0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 79  OK;.  }..  /* Sy
1d900 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
1d910 69 6c 65 20 69 66 20 72 65 71 75 69 72 65 64 2e  ile if required.
1d920 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 66   */.  if( pPg->f
1d930 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
1d940 53 59 4e 43 20 29 7b 0a 20 20 20 20 72 63 20 3d  SYNC ){.    rc =
1d950 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
1d960 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
1d970 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1d980 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
1d990 26 26 20 0a 20 20 20 20 20 20 21 28 70 50 61 67  && .      !(pPag
1d9a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
1d9b0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
1d9c0 44 45 5f 4d 45 4d 4f 52 59 29 20 26 26 0a 20 20  DE_MEMORY) &&.  
1d9d0 20 20 20 20 21 28 73 71 6c 69 74 65 33 4f 73 44      !(sqlite3OsD
1d9e0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1d9f0 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
1da00 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
1da10 46 45 5f 41 50 50 45 4e 44 29 0a 20 20 20 20 29  FE_APPEND).    )
1da20 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
1da30 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRec = 0;.      
1da40 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
1da50 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
1da60 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
1da70 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1da80 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 69 73   of this page is
1da90 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
1daa0 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
1dab0 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61  .  ** the databa
1dac0 73 65 20 69 6d 61 67 65 2c 20 69 74 20 6d 61 79  se image, it may
1dad0 20 6e 65 65 64 20 74 6f 20 62 65 20 77 72 69 74   need to be writ
1dae0 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  ten to the sub-j
1daf0 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 20 54 68 69  ournal..  ** Thi
1db00 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65  s is because the
1db10 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77   call to pager_w
1db20 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29 20  rite_pagelist() 
1db30 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20  below will not. 
1db40 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72 69   ** actually wri
1db50 74 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 66  te data to the f
1db60 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ile in this case
1db70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 73  ..  **.  ** Cons
1db80 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
1db90 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20 65  ng sequence of e
1dba0 76 65 6e 74 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  vents:.  **.  **
1dbb0 20 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20     BEGIN;.  **  
1dbc0 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65     <journal page
1dbd0 20 58 3e 0a 20 20 2a 2a 20 20 20 20 20 3c 6d 6f   X>.  **     <mo
1dbe0 64 69 66 79 20 70 61 67 65 20 58 3e 0a 20 20 2a  dify page X>.  *
1dbf0 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20  *     SAVEPOINT 
1dc00 73 70 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c  sp;.  **       <
1dc10 73 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65 20  shrink database 
1dc20 66 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73 3e  file to Y pages>
1dc30 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67 65  .  **       page
1dc40 72 53 74 72 65 73 73 28 70 61 67 65 20 58 29 0a  rStress(page X).
1dc50 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43    **     ROLLBAC
1dc60 4b 20 54 4f 20 73 70 3b 0a 20 20 2a 2a 0a 20 20  K TO sp;.  **.  
1dc70 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68 65  ** If (X>Y), the
1dc80 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74 72 65  n when pagerStre
1dc90 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61 67  ss is called pag
1dca0 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  e X will not be 
1dcb0 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 6f 75 74  written.  ** out
1dcc0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1dcd0 20 66 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20   file, but will 
1dce0 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20  be dropped from 
1dcf0 74 68 65 20 63 61 63 68 65 2e 20 54 68 65 6e 2c  the cache. Then,
1dd00 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  .  ** following 
1dd10 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  the "ROLLBACK TO
1dd20 20 73 70 22 20 73 74 61 74 65 6d 65 6e 74 2c 20   sp" statement, 
1dd30 72 65 61 64 69 6e 67 20 70 61 67 65 20 58 20 77  reading page X w
1dd40 69 6c 6c 20 72 65 61 64 0a 20 20 2a 2a 20 64 61  ill read.  ** da
1dd50 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ta from the data
1dd60 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20  base file. This 
1dd70 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70 79  will be the copy
1dd80 20 6f 66 20 70 61 67 65 20 58 20 61 73 20 69 74   of page X as it
1dd90 0a 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20 74  .  ** was when t
1dda0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
1ddb0 74 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20 69  tarted, not as i
1ddc0 74 20 77 61 73 20 77 68 65 6e 20 22 53 41 56 45  t was when "SAVE
1ddd0 50 4f 49 4e 54 20 73 70 22 0a 20 20 2a 2a 20 77  POINT sp".  ** w
1dde0 61 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a  as executed..  *
1ddf0 2a 0a 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74  *.  ** The solut
1de00 69 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20  ion is to write 
1de10 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
1de20 20 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f   for page X into
1de30 20 74 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a   the .  ** sub-j
1de40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20  ournal file now 
1de50 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
1de60 72 65 61 64 79 20 74 68 65 72 65 29 2c 20 73 6f  ready there), so
1de70 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20 20   that it will.  
1de80 2a 2a 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  ** be restored t
1de90 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61  o its current va
1dea0 6c 75 65 20 77 68 65 6e 20 74 68 65 20 22 52 4f  lue when the "RO
1deb0 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 69 73  LLBACK TO sp" is
1dec0 20 0a 20 20 2a 2a 20 65 78 65 63 75 74 65 64 2e   .  ** executed.
1ded0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
1dee0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 67  SQLITE_OK && pPg
1def0 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ->pgno>pPager->d
1df00 62 53 69 7a 65 20 26 26 20 73 75 62 6a 52 65 71  bSize && subjReq
1df10 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29  uiresPage(pPg) )
1df20 7b 0a 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f  {.    rc = subjo
1df30 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a  urnalPage(pPg);.
1df40 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20    }..  /* Write 
1df50 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1df60 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20  the page out to 
1df70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1df80 65 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  e. */.  if( rc==
1df90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1dfa0 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30   pPg->pDirty = 0
1dfb0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1dfc0 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
1dfd0 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  pPg);.  }..  /* 
1dfe0 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
1dff0 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28   clean. */.  if(
1e000 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e010 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  {.    PAGERTRACE
1e020 28 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67  (("STRESS %d pag
1e030 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
1e040 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1e050 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  gno));.    sqlit
1e060 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
1e070 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72  n(pPg);.  }..  r
1e080 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
1e090 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d  r(pPager, rc);.}
1e0a0 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  .../*.** Allocat
1e0b0 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
1e0c0 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a   a new Pager obj
1e0d0 65 63 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f  ect and put a po
1e0e0 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69  inter to it.** i
1e0f0 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20  n *ppPager. The 
1e100 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65  pager should eve
1e110 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64  ntually be freed
1e120 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a   by passing it.*
1e130 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  * to sqlite3Page
1e140 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  rClose()..**.** 
1e150 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72  The zFilename ar
1e160 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61  gument is the pa
1e170 74 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  th to the databa
1e180 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e  se file to open.
1e190 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
1e1a0 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20   is NULL then a 
1e1b0 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74  randomly-named t
1e1c0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
1e1d0 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
1e1e0 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65  used as the file
1e1f0 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54   to be cached. T
1e200 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61  emporary files a
1e210 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a  re be deleted.**
1e220 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77   automatically w
1e230 68 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f  hen they are clo
1e240 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d  sed. If zFilenam
1e250 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
1e260 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66  then .** all inf
1e270 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64  ormation is held
1e280 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73   in cache. It is
1e290 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74   never written t
1e2a0 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73  o disk. .** This
1e2b0 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
1e2c0 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d  implement an in-
1e2d0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
1e2e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72  .**.** The nExtr
1e2f0 61 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63  a parameter spec
1e300 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72  ifies the number
1e310 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
1e320 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  ce allocated.** 
1e330 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20  along with each 
1e340 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
1e350 54 68 69 73 20 73 70 61 63 65 20 69 73 20 61 76  This space is av
1e360 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75  ailable to the u
1e370 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73  ser.** via the s
1e380 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
1e390 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a  tra() API..**.**
1e3a0 20 54 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d   The flags argum
1e3b0 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 73  ent is used to s
1e3c0 70 65 63 69 66 79 20 70 72 6f 70 65 72 74 69 65  pecify propertie
1e3d0 73 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68  s that affect th
1e3e0 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f  e.** operation o
1e3f0 66 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20  f the pager. It 
1e400 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64  should be passed
1e410 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f   some bitwise co
1e420 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  mbination.** of 
1e430 74 68 65 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a  the PAGER_OMIT_J
1e440 4f 55 52 4e 41 4c 20 61 6e 64 20 50 41 47 45 52  OURNAL and PAGER
1e450 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66 6c 61  _NO_READLOCK fla
1e460 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66  gs..**.** The vf
1e470 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72  sFlags parameter
1e480 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f   is a bitmask to
1e490 20 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61   pass to the fla
1e4a0 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  gs parameter.** 
1e4b0 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d  of the xOpen() m
1e4c0 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70  ethod of the sup
1e4d0 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f  plied VFS when o
1e4e0 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a  pening files. .*
1e4f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
1e500 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f  r object is allo
1e510 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 73 70  cated and the sp
1e520 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65  ecified file ope
1e530 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66  ned .** successf
1e540 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ully, SQLITE_OK 
1e550 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1e560 2a 70 70 50 61 67 65 72 20 73 65 74 20 74 6f 20  *ppPager set to 
1e570 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  point to.** the 
1e580 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74  new pager object
1e590 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
1e5a0 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69  curs, *ppPager i
1e5b0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a  s set to NULL.**
1e5c0 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20   and error code 
1e5d0 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66  returned. This f
1e5e0 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75  unction may retu
1e5f0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  rn SQLITE_NOMEM.
1e600 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  ** (sqlite3Mallo
1e610 63 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61  c() is used to a
1e620 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c  llocate memory),
1e630 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
1e640 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20   or .** various 
1e650 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72  SQLITE_IO_XXX er
1e660 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rors..*/.int sql
1e670 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20  ite3PagerOpen(. 
1e680 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1e690 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  fs,       /* The
1e6a0 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79   virtual file sy
1e6b0 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20  stem to use */. 
1e6c0 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
1e6d0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ,         /* OUT
1e6e0 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67  : Return the Pag
1e6f0 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72  er structure her
1e700 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
1e710 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
1e720 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
1e730 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
1e740 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  open */.  int nE
1e750 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20  xtra,           
1e760 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65     /* Extra byte
1e770 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68  s append to each
1e780 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
1e790 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
1e7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e7b0 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69   flags controlli
1e7c0 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  ng this file */.
1e7d0 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
1e7e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
1e7f0 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
1e800 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66  gh to sqlite3_vf
1e810 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a  s.xOpen() */.){.
1e820 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61    u8 *pPtr;.  Pa
1e830 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b  ger *pPager = 0;
1e840 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
1e850 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61  object to alloca
1e860 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f  te and return */
1e870 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1e880 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52  TE_OK;      /* R
1e890 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1e8a0 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30  int tempFile = 0
1e8b0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
1e8c0 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20   for temp files 
1e8d0 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79  (incl. in-memory
1e8e0 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74   files) */.  int
1e8f0 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20   memDb = 0;     
1e900 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1e910 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
1e920 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
1e930 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30  int readOnly = 0
1e940 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
1e950 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65   if this is a re
1e960 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a  ad-only file */.
1e970 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c    int journalFil
1e980 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79  eSize;     /* By
1e990 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
1e9a0 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c  for each journal
1e9b0 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   fd */.  char *z
1e9c0 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20  Pathname = 0;   
1e9d0 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74    /* Full path t
1e9e0 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  o database file 
1e9f0 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61  */.  int nPathna
1ea00 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  me = 0;       /*
1ea10 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1ea20 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f   in zPathname */
1ea30 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61  .  int useJourna
1ea40 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  l = (flags & PAG
1ea50 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29  ER_OMIT_JOURNAL)
1ea60 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f  ==0; /* False to
1ea70 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f   omit journal */
1ea80 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63  .  int noReadloc
1ea90 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  k = (flags & PAG
1eaa0 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21  ER_NO_READLOCK)!
1eab0 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =0;  /* True to 
1eac0 6f 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b 20 2a  omit read-lock *
1ead0 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53 69  /.  int pcacheSi
1eae0 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  ze = sqlite3Pcac
1eaf0 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20  heSize();       
1eb00 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f  /* Bytes to allo
1eb10 63 61 74 65 20 66 6f 72 20 50 43 61 63 68 65 20  cate for PCache 
1eb20 2a 2f 0a 20 20 75 31 36 20 73 7a 50 61 67 65 44  */.  u16 szPageD
1eb30 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  flt = SQLITE_DEF
1eb40 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20  AULT_PAGE_SIZE; 
1eb50 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65   /* Default page
1eb60 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 2f 2a 20 46   size */..  /* F
1eb70 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75  igure out how mu
1eb80 63 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75  ch space is requ
1eb90 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f  ired for each jo
1eba0 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c  urnal file-handl
1ebb0 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72  e.  ** (there ar
1ebc0 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74  e two of them, t
1ebd0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
1ebe0 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  and the sub-jour
1ebf0 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20  nal). This.  ** 
1ec00 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73  is the maximum s
1ec10 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
1ec20 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  r an in-memory j
1ec30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
1ec40 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72  le .  ** and a r
1ec50 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66  egular journal f
1ec60 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65  ile-handle. Note
1ec70 20 74 68 61 74 20 61 20 22 72 65 67 75 6c 61 72   that a "regular
1ec80 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22   journal-handle"
1ec90 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77  .  ** may be a w
1eca0 72 61 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f  rapper capable o
1ecb0 66 20 63 61 63 68 69 6e 67 20 74 68 65 20 66 69  f caching the fi
1ecc0 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  rst portion of t
1ecd0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
1ece0 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74  file in memory t
1ecf0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
1ed00 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
1ed10 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a  imization (see .
1ed20 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65    ** source file
1ed30 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a   journal.c)..  *
1ed40 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a  /.  if( sqlite3J
1ed50 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
1ed60 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e  >sqlite3MemJourn
1ed70 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20  alSize() ){.    
1ed80 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
1ed90 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
1eda0 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
1edb0 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
1edc0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
1edd0 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65   = ROUND8(sqlite
1ede0 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  3MemJournalSize(
1edf0 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ));.  }..  /* Se
1ee00 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  t the output var
1ee10 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e  iable to NULL in
1ee20 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f   case an error o
1ee30 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50  ccurs. */.  *ppP
1ee40 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  ager = 0;..  /* 
1ee50 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72  Compute and stor
1ee60 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  e the full pathn
1ee70 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61  ame in an alloca
1ee80 74 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74  ted buffer point
1ee90 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50  ed.  ** to by zP
1eea0 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  athname, length 
1eeb0 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69  nPathname. Or, i
1eec0 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  f this is a temp
1eed0 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a  orary file,.  **
1eee0 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74   leave both nPat
1eef0 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e  hname and zPathn
1ef00 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20  ame set to 0..  
1ef10 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
1ef20 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
1ef30 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74 68 6e  0] ){.    nPathn
1ef40 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  ame = pVfs->mxPa
1ef50 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50  thname+1;.    zP
1ef60 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
1ef70 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d  3Malloc(nPathnam
1ef80 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50  e*2);.    if( zP
1ef90 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  athname==0 ){.  
1efa0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1efb0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23  E_NOMEM;.    }.#
1efc0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1efd0 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20  IT_MEMORYDB.    
1efe0 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
1eff0 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29  name,":memory:")
1f000 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ==0 ){.      mem
1f010 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50  Db = 1;.      zP
1f020 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a  athname[0] = 0;.
1f030 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
1f040 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 50 61  .    {.      zPa
1f050 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f  thname[0] = 0; /
1f060 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74  * Make sure init
1f070 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20  ialized even if 
1f080 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66  FullPathname() f
1f090 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20 72 63  ails */.      rc
1f0a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
1f0b0 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
1f0c0 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Filename, nPathn
1f0d0 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  ame, zPathname);
1f0e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 50 61 74  .    }..    nPat
1f0f0 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  hname = sqlite3S
1f100 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d  trlen30(zPathnam
1f110 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
1f120 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61  SQLITE_OK && nPa
1f130 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d  thname+8>pVfs->m
1f140 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  xPathname ){.   
1f150 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
1f160 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20  h is taken when 
1f170 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68  the journal path
1f180 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20   required by.   
1f190 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
1f1a0 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  se being opened 
1f1b0 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61  will be more tha
1f1c0 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  n pVfs->mxPathna
1f1d0 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65  me.      ** byte
1f1e0 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69  s in length. Thi
1f1f0 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  s means the data
1f200 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f  base cannot be o
1f210 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20  pened,.      ** 
1f220 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  as it will not b
1f230 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70  e possible to op
1f240 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
1f250 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20  ile or even.    
1f260 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61    ** check for a
1f270 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66   hot-journal bef
1f280 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20  ore reading..   
1f290 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
1f2a0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
1f2b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1f2c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1f2d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1f2e0 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
1f2f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1f300 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1f310 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
1f320 20 66 6f 72 20 74 68 65 20 50 61 67 65 72 20 73   for the Pager s
1f330 74 72 75 63 74 75 72 65 2c 20 50 43 61 63 68 65  tructure, PCache
1f340 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a   object, the.  *
1f350 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73  * three file des
1f360 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61  criptors, the da
1f370 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
1f380 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
1f390 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65   .  ** file name
1f3a0 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20  . The layout in 
1f3b0 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c  memory is as fol
1f3c0 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lows:.  **.  ** 
1f3d0 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74      Pager object
1f3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3f0 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65      (sizeof(Page
1f400 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  r) bytes).  **  
1f410 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74     PCache object
1f420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f430 20 20 20 28 73 71 6c 69 74 65 33 50 63 61 63 68     (sqlite3Pcach
1f440 65 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20  eSize() bytes). 
1f450 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65   **     Database
1f460 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
1f470 20 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73          (pVfs->s
1f480 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20  zOsFile bytes). 
1f490 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72   **     Sub-jour
1f4a0 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
1f4b0 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c          (journal
1f4c0 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a  FileSize bytes).
1f4d0 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f    **     Main jo
1f4e0 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
1f4f0 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61  e        (journa
1f500 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29  lFileSize bytes)
1f510 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61  .  **     Databa
1f520 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20  se file name    
1f530 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68            (nPath
1f540 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20  name+1 bytes).  
1f550 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
1f560 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20  ile name        
1f570 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d         (nPathnam
1f580 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a  e+8+1 bytes).  *
1f590 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a  /.  pPtr = (u8 *
1f5a0 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
1f5b0 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73  ro(.    ROUND8(s
1f5c0 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20  izeof(*pPager)) 
1f5d0 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20  +      /* Pager 
1f5e0 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
1f5f0 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69   ROUND8(pcacheSi
1f600 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  ze) +           
1f610 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  /* PCache object
1f620 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70   */.    ROUND8(p
1f630 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b  Vfs->szOsFile) +
1f640 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
1f650 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20  in db file */.  
1f660 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
1f670 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20  e * 2 +         
1f680 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72   /* The two jour
1f690 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20  nal files */ .  
1f6a0 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20    nPathname + 1 
1f6b0 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +               
1f6c0 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f   /* zFilename */
1f6d0 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b  .    nPathname +
1f6e0 20 38 20 2b 20 31 20 20 20 20 20 20 20 20 20 20   8 + 1          
1f6f0 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20      /* zJournal 
1f700 2a 2f 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  */.  );.  assert
1f710 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
1f720 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e  GNMENT(SQLITE_IN
1f730 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c  T_TO_PTR(journal
1f740 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20  FileSize)) );.  
1f750 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20  if( !pPtr ){.   
1f760 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
1f770 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
1f780 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1f790 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20  M;.  }.  pPager 
1f7a0 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  =              (
1f7b0 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20  Pager*)(pPtr);. 
1f7c0 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
1f7d0 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28   =    (PCache*)(
1f7e0 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73  pPtr += ROUND8(s
1f7f0 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29  izeof(*pPager)))
1f800 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d  ;.  pPager->fd =
1f810 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65     (sqlite3_file
1f820 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
1f830 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a  8(pcacheSize));.
1f840 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d    pPager->sjfd =
1f850 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
1f860 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
1f870 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29  pVfs->szOsFile))
1f880 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  ;.  pPager->jfd 
1f890 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  =  (sqlite3_file
1f8a0 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e  *)(pPtr += journ
1f8b0 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70  alFileSize);.  p
1f8c0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
1f8d0 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50   =    (char*)(pP
1f8e0 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c  tr += journalFil
1f8f0 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74  eSize);.  assert
1f900 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
1f910 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a  GNMENT(pPager->j
1f920 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  fd) );..  /* Fil
1f930 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a  l in the Pager.z
1f940 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67  Filename and Pag
1f950 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66  er.zJournal buff
1f960 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64  ers, if required
1f970 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68  . */.  if( zPath
1f980 6e 61 6d 65 20 29 7b 0a 20 20 20 20 70 50 61 67  name ){.    pPag
1f990 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20  er->zJournal =  
1f9a0 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d   (char*)(pPtr +=
1f9b0 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 29 3b   nPathname + 1);
1f9c0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
1f9d0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
1f9e0 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
1f9f0 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ame);.    memcpy
1fa00 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
1fa10 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  l, zPathname, nP
1fa20 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
1fa30 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a  mcpy(&pPager->zJ
1fa40 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
1fa50 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38  ], "-journal", 8
1fa60 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
1fa70 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  r->zFilename[0]=
1fa80 3d 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  =0 ) pPager->zJo
1fa90 75 72 6e 61 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20  urnal[0] = 0;.  
1faa0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1fab0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  Pathname);.  }. 
1fac0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20   pPager->pVfs = 
1fad0 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pVfs;.  pPager->
1fae0 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c  vfsFlags = vfsFl
1faf0 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  ags;..  /* Open 
1fb00 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
1fb10 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
1fb20 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
1fb30 65 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29  e[0] && !memDb )
1fb40 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d  {.    int fout =
1fb50 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1fb60 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c         /* VFS fl
1fb70 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ags returned by 
1fb80 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72  xOpen() */.    r
1fb90 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
1fba0 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
1fbb0 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
1fbc0 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c  r->fd, vfsFlags,
1fbd0 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 72 65 61   &fout);.    rea
1fbe0 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51  dOnly = (fout&SQ
1fbf0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
1fc00 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  LY);..    /* If 
1fc10 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75 63  the file was suc
1fc20 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64  cessfully opened
1fc30 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
1fc40 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63  access,.    ** c
1fc50 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20  hoose a default 
1fc60 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73  page size in cas
1fc70 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65  e we have to cre
1fc80 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ate the.    ** d
1fc90 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
1fca0 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
1fcb0 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d  ize is the maxim
1fcc0 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20  um of:.    **.  
1fcd0 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45    **    + SQLITE
1fce0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
1fcf0 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20  ZE,.    **    + 
1fd00 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
1fd10 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53  ed by sqlite3OsS
1fd20 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
1fd30 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67  **    + The larg
1fd40 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68  est page size th
1fd50 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  at can be writte
1fd60 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20  n atomically..  
1fd70 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
1fd80 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72  =SQLITE_OK && !r
1fd90 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
1fda0 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
1fdb0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
1fdc0 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41  sert(SQLITE_DEFA
1fdd0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53  ULT_PAGE_SIZE<=S
1fde0 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
1fdf0 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  T_PAGE_SIZE);.  
1fe00 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44 66      if( szPageDf
1fe10 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  lt<pPager->secto
1fe20 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  rSize ){.       
1fe30 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63   if( pPager->sec
1fe40 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  torSize>SQLITE_M
1fe50 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
1fe60 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
1fe70 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53    szPageDflt = S
1fe80 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
1fe90 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20  T_PAGE_SIZE;.   
1fea0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1feb0 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
1fec0 20 3d 20 28 75 31 36 29 70 50 61 67 65 72 2d 3e   = (u16)pPager->
1fed0 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
1fee0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69      }.      }.#i
1fef0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1ff00 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
1ff10 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
1ff20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
1ff30 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
1ff40 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
1ff50 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  >fd);.        in
1ff60 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73  t ii;.        as
1ff70 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
1ff80 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
1ff90 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  2>>8));.        
1ffa0 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
1ffb0 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28  CAP_ATOMIC64K==(
1ffc0 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20  65536>>8));.    
1ffd0 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
1ffe0 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
1fff0 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b  GE_SIZE<=65536);
20000 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d  .        for(ii=
20010 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d  szPageDflt; ii<=
20020 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
20030 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69  LT_PAGE_SIZE; ii
20040 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20  =ii*2){.        
20050 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54    if( iDc&(SQLIT
20060 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
20070 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20  ii>>8)) ){.     
20080 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
20090 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20  t = ii;.        
200a0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
200b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
200c0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
200d0 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72  /* If a temporar
200e0 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73  y file is reques
200f0 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f  ted, it is not o
20100 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  pened immediatel
20110 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  y..    ** In thi
20120 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74  s case we accept
20130 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
20140 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79  e size and delay
20150 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a   actually.    **
20160 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c   opening the fil
20170 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73  e until the firs
20180 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74  t call to OsWrit
20190 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
201a0 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  ** This branch i
201b0 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61  s also run for a
201c0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
201d0 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f  base. An in-memo
201e0 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  ry.    ** databa
201f0 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  se is the same a
20200 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68  s a temp-file th
20210 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  at is never writ
20220 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a  ten out to.    *
20230 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20  * disk and uses 
20240 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c  an in-memory rol
20250 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20  lback journal.. 
20260 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46     */ .    tempF
20270 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ile = 1;.    pPa
20280 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
20290 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
202a0 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66    readOnly = (vf
202b0 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
202c0 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20  EN_READONLY);.  
202d0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
202e0 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61  owing call to Pa
202f0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
20300 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74   serves to set t
20310 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a  he value of .  *
20320 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  * Pager.pageSize
20330 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65   and to allocate
20340 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53   the Pager.pTmpS
20350 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a  pace buffer..  *
20360 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
20370 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
20380 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d  ert( pPager->mem
20390 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  Db==0 );.    rc 
203a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
203b0 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
203c0 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d  , &szPageDflt, -
203d0 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
203e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
203f0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
20400 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  an error occurre
20410 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74  d in either of t
20420 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c  he blocks above,
20430 20 66 72 65 65 20 74 68 65 20 0a 20 20 2a 2a 20   free the .  ** 
20440 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
20450 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69  and close the fi
20460 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  le..  */.  if( r
20470 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
20480 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
20490 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  ger->pTmpSpace )
204a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  ;.    sqlite3OsC
204b0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
204c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
204d0 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ee(pPager);.    
204e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
204f0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
20500 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63  the PCache objec
20510 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  t. */.  assert( 
20520 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20  nExtra<1000 );. 
20530 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38   nExtra = ROUND8
20540 28 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69  (nExtra);.  sqli
20550 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a  te3PcacheOpen(sz
20560 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61  PageDflt, nExtra
20570 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20  , !memDb,.      
20580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d                !m
20590 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73  emDb?pagerStress
205a0 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67  :0, (void *)pPag
205b0 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61  er, pPager->pPCa
205c0 63 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52  che);..  PAGERTR
205d0 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE(("OPEN %d %s
205e0 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
205f0 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70  D(pPager->fd), p
20600 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
20610 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
20620 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70  OPEN %p %s\n", p
20630 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a  Pager, pPager->z
20640 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50  Filename))..  pP
20650 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
20660 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61   = (u8)useJourna
20670 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52  l;.  pPager->noR
20680 65 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65 61  eadlock = (noRea
20690 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c  dlock && readOnl
206a0 79 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70 50  y) ?1:0;.  /* pP
206b0 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
206c0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
206d0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
206e0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
206f0 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a  r->nRef = 0; */.
20700 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
20710 56 61 6c 69 64 20 3d 20 28 75 38 29 6d 65 6d 44  Valid = (u8)memD
20720 62 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  b;.  /* pPager->
20730 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  stmtSize = 0; */
20740 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
20750 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  mtJSize = 0; */.
20760 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61    /* pPager->nPa
20770 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  ge = 0; */.  pPa
20780 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51  ger->mxPgno = SQ
20790 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f  LITE_MAX_PAGE_CO
207a0 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  UNT;.  /* pPager
207b0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
207c0 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73  UNLOCK; */.  ass
207d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
207e0 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20  te == (tempFile 
207f0 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ? PAGER_EXCLUSIV
20800 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  E : PAGER_UNLOCK
20810 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  ) );.  /* pPager
20820 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a  ->errMask = 0; *
20830 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  /.  pPager->temp
20840 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46  File = (u8)tempF
20850 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74  ile;.  assert( t
20860 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
20870 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
20880 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  L .          || 
20890 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
208a0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
208b0 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72  USIVE );.  asser
208c0 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
208d0 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d  MODE_EXCLUSIVE==
208e0 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  1 );.  pPager->e
208f0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28  xclusiveMode = (
20900 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20  u8)tempFile; .  
20910 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
20920 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
20930 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
20940 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75  ager->memDb = (u
20950 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65  8)memDb;.  pPage
20960 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75  r->readOnly = (u
20970 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a  8)readOnly;.  /*
20980 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
20990 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  c = 0; */.  pPag
209a0 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 28 70 50  er->noSync = (pP
209b0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c  ager->tempFile |
209c0 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 29 20 3f  | !useJournal) ?
209d0 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  1:0;.  pPager->f
209e0 75 6c 6c 53 79 6e 63 20 3d 20 70 50 61 67 65 72  ullSync = pPager
209f0 2d 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a 20  ->noSync ?0:1;. 
20a00 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
20a10 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
20a20 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70  C_NORMAL;.  /* p
20a30 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
20a40 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
20a50 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
20a60 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
20a70 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20  ger->pLast = 0; 
20a80 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78  */.  pPager->nEx
20a90 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72  tra = (u16)nExtr
20aa0 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  a;.  pPager->jou
20ab0 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20  rnalSizeLimit = 
20ac0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a  SQLITE_DEFAULT_J
20ad0 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49  OURNAL_SIZE_LIMI
20ae0 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  T;.  assert( isO
20af0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
20b00 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  || tempFile );. 
20b10 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
20b20 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 6d 65  Pager);.  if( me
20b30 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65  mDb ){.    pPage
20b40 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
20b50 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
20b60 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20  DE_MEMORY;.  }. 
20b70 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73   /* pPager->xBus
20b80 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f  yHandler = 0; */
20b90 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42  .  /* pPager->pB
20ba0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20  usyHandlerArg = 
20bb0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65  0; */.  /* memse
20bc0 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c  t(pPager->aHash,
20bd0 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65   0, sizeof(pPage
20be0 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20  r->aHash)); */. 
20bf0 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67   *ppPager = pPag
20c00 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  er;.  return SQL
20c10 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a  ITE_OK;.}..../*.
20c20 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
20c30 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
20c40 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66   transitioning f
20c50 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  rom PAGER_UNLOCK
20c60 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41   to.** PAGER_SHA
20c70 52 45 44 20 73 74 61 74 65 2e 20 49 74 20 74 65  RED state. It te
20c80 73 74 73 20 69 66 20 74 68 65 72 65 20 69 73 20  sts if there is 
20c90 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72  a hot journal pr
20ca0 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20  esent in.** the 
20cb0 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20  file-system for 
20cc0 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e  the given pager.
20cd0 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69   A hot journal i
20ce0 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e  s one that .** n
20cf0 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
20d00 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e  d back. Accordin
20d10 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  g to this functi
20d20 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  on, a hot-journa
20d30 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73  l.** file exists
20d40 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
20d50 67 20 63 72 69 74 65 72 69 61 20 61 72 65 20 6d  g criteria are m
20d60 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  et:.**.**   * Th
20d70 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
20d80 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c  xists in the fil
20d90 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a  e system, and.**
20da0 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20     * No process 
20db0 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44  holds a RESERVED
20dc0 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
20dd0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
20de0 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20   file, and.**   
20df0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
20e00 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67 72  ile itself is gr
20e10 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74  eater than 0 byt
20e20 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a  es in size, and.
20e30 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73 74  **   * The first
20e40 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75   byte of the jou
20e50 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
20e60 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30   and is not 0x00
20e70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
20e80 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
20e90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20ea0 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72   is 0 but a jour
20eb0 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73  nal file.** exis
20ec0 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62  ts, that is prob
20ed0 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  ably an old jour
20ee0 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72  nal left over fr
20ef0 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61  om a prior.** da
20f00 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
20f10 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68  same name. In th
20f20 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72  is case the jour
20f30 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a  nal file is.** j
20f40 75 73 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e  ust deleted usin
20f50 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78  g OsDelete, *pEx
20f60 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 30  ists is set to 0
20f70 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a   and SQLITE_OK.*
20f80 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  * is returned..*
20f90 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
20fa0 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b  e does not check
20fb0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 6d   if there is a m
20fc0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
20fd0 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65  lename.** at the
20fe0 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
20ff0 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 61  . If there is, a
21000 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a  nd that master j
21010 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64  ournal file.** d
21020 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74  oes not exist, t
21030 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
21040 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  file is not real
21050 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a  ly hot. In this.
21060 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f 75  ** case this rou
21070 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
21080 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76   a false-positiv
21090 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61  e. The pager_pla
210a0 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  yback().** routi
210b0 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72  ne will discover
210c0 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
210d0 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65  l file is not re
210e0 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a  ally hot and .**
210f0 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69   will not roll i
21100 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49  t back. .**.** I
21110 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  f a hot-journal 
21120 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f  file is found to
21130 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73   exist, *pExists
21140 20 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64   is set to 1 and
21150 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72   .** SQLITE_OK r
21160 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68  eturned. If no h
21170 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
21180 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78  is present, *pEx
21190 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74  ists is.** set t
211a0 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  o 0 and SQLITE_O
211b0 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  K returned. If a
211c0 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
211d0 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a  s while trying.*
211e0 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  * to determine w
211f0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
21200 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
21210 20 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20   exists, the IO 
21220 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73  error.** code is
21230 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
21240 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69  e value of *pExi
21250 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64  sts is undefined
21260 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21270 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61  hasHotJournal(Pa
21280 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
21290 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71   *pExists){.  sq
212a0 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73  lite3_vfs * cons
212b0 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d  t pVfs = pPager-
212c0 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  >pVfs;.  int rc;
212d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212e0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
212f0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65   code */.  int e
21300 78 69 73 74 73 3b 20 20 20 20 20 20 20 20 20 20  xists;          
21310 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
21320 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   if a journal fi
21330 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  le is present */
21340 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
21350 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
21360 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
21370 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
21380 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
21390 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  ->fd) );.  asser
213a0 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  t( !isOpen(pPage
213b0 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2a 70  r->jfd) );..  *p
213c0 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 72 63  Exists = 0;.  rc
213d0 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
213e0 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  ss(pVfs, pPager-
213f0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54  >zJournal, SQLIT
21400 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
21410 20 26 65 78 69 73 74 73 29 3b 0a 20 20 69 66 28   &exists);.  if(
21420 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
21430 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20  & exists ){.    
21440 69 6e 74 20 6c 6f 63 6b 65 64 3b 20 20 20 20 20  int locked;     
21450 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
21460 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63  rue if some proc
21470 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45  ess holds a RESE
21480 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20  RVED lock */..  
21490 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74    /* Race condit
214a0 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68  ion here:  Anoth
214b0 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
214c0 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69   have been holdi
214d0 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68  ng the.    ** th
214e0 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
214f0 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e  and have a journ
21500 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73  al open at the s
21510 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
21520 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62   .    ** call ab
21530 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65  ove, but then de
21540 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
21550 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f   and drop the lo
21560 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ck before.    **
21570 20 77 65 20 67 65 74 20 74 6f 20 74 68 65 20 66   we get to the f
21580 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33  ollowing sqlite3
21590 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
215a0 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20  ock() call.  If 
215b0 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74  that.    ** is t
215c0 68 65 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f  he case, this ro
215d0 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e  utine might thin
215e0 6b 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  k there is a hot
215f0 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20   journal when.  
21600 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65    ** in fact the
21610 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69  re is none.  Thi
21620 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66  s results in a f
21630 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68  alse-positive wh
21640 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ich will.    ** 
21650 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79  be dealt with by
21660 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f   the playback ro
21670 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23  utine.  Ticket #
21680 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  3883..    */.   
21690 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43   rc = sqlite3OsC
216a0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
216b0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f  (pPager->fd, &lo
216c0 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  cked);.    if( r
216d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
216e0 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20  !locked ){.     
216f0 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 20   int nPage;..   
21700 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20     /* Check the 
21710 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
21720 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 69 74  base file. If it
21730 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 30 20 70   consists of 0 p
21740 61 67 65 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74  ages,.      ** t
21750 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a  hen delete the j
21760 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65  ournal file. See
21770 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
21780 65 6e 74 20 61 62 6f 76 65 20 66 6f 72 20 0a 20  ent above for . 
21790 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 61 73       ** the reas
217a0 6f 6e 69 6e 67 20 68 65 72 65 2e 20 20 44 65 6c  oning here.  Del
217b0 65 74 65 20 74 68 65 20 6f 62 73 6f 6c 65 74 65  ete the obsolete
217c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e   journal file un
217d0 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 52  der.      ** a R
217e0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20  ESERVED lock to 
217f0 61 76 6f 69 64 20 72 61 63 65 20 63 6f 6e 64 69  avoid race condi
21800 74 69 6f 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f  tions and to avo
21810 69 64 20 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20  id violating.   
21820 20 20 20 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a     ** [H33020]..
21830 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
21840 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
21850 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
21860 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
21870 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21880 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
21890 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ( nPage==0 ){.  
218a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
218b0 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
218c0 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ();.          if
218d0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
218e0 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 0a  =PAGER_RESERVED.
218f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21900 20 7c 7c 20 20 73 71 6c 69 74 65 33 4f 73 4c 6f   ||  sqlite3OsLo
21910 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52  ck(pPager->fd, R
21920 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53  ESERVED_LOCK)==S
21930 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21940 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
21950 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50  sDelete(pVfs, pP
21960 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
21970 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
21980 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
21990 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
219a0 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20  RED );.         
219b0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
219c0 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  tate==PAGER_SHAR
219d0 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ED ){.          
219e0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c      sqlite3OsUnl
219f0 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
21a00 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
21a10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21a20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21a30 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
21a40 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
21a50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21a60 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72       /* The jour
21a70 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
21a80 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  and no other con
21a90 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65  nection has a re
21aa0 73 65 72 76 65 64 0a 20 20 20 20 20 20 20 20 20  served.         
21ab0 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c   ** or greater l
21ac0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
21ad0 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68  ase file. Now ch
21ae0 65 63 6b 20 74 68 61 74 20 74 68 65 72 65 20 69  eck that there i
21af0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
21b00 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d  t least one non-
21b10 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68  zero bytes at th
21b20 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
21b30 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
21b40 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
21b50 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63  re is, then we c
21b60 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75  onsider this jou
21b70 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20  rnal to be hot. 
21b80 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20  If not, .       
21b90 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20     ** it can be 
21ba0 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20  ignored..       
21bb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
21bc0 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f  int f = SQLITE_O
21bd0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
21be0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
21bf0 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  URNAL;.         
21c00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
21c10 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
21c20 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
21c30 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b  er->jfd, f, &f);
21c40 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
21c50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21c60 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20 66              u8 f
21c70 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  irst = 0;.      
21c80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21c90 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
21ca0 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26 66  >jfd, (void *)&f
21cb0 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20  irst, 1, 0);.   
21cc0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
21cd0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
21ce0 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
21cf0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
21d00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
21d10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21d20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
21d30 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
21d40 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45  .            *pE
21d50 78 69 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d  xists = (first!=
21d60 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  0);.          }e
21d70 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
21d80 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20  TE_CANTOPEN ){. 
21d90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
21da0 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20   we cannot open 
21db0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
21dc0 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64  rnal file in ord
21dd0 65 72 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20  er to see if.   
21de0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20           ** its 
21df0 68 61 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65  has a zero heade
21e00 72 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  r, that might be
21e10 20 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65   due to an I/O e
21e20 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20  rror, or.       
21e30 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74       ** it might
21e40 20 62 65 20 64 75 65 20 74 6f 20 74 68 65 20 72   be due to the r
21e50 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  ace condition de
21e60 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e  scribed above an
21e70 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20  d in.           
21e80 20 2a 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33   ** ticket #3883
21e90 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61  .  Either way, a
21ea0 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a  ssume that the j
21eb0 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20  ournal is hot.. 
21ec0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68             ** Th
21ed0 69 73 20 6d 69 67 68 74 20 62 65 20 61 20 66 61  is might be a fa
21ee0 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42  lse positive.  B
21ef0 75 74 20 69 66 20 69 74 20 69 73 2c 20 74 68 65  ut if it is, the
21f00 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
21f10 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a    ** automatic j
21f20 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20  ournal playback 
21f30 61 6e 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63  and recovery mec
21f40 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c  hanism will deal
21f50 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
21f60 77 69 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e  with it under an
21f70 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
21f80 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20  where we do not 
21f90 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20  need to.        
21fa0 20 20 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20      ** worry so 
21fb0 6d 75 63 68 20 77 69 74 68 20 72 61 63 65 20 63  much with race c
21fc0 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20  onditions..     
21fd0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
21fe0 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d        *pExists =
21ff0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
22000 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
22010 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22020 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
22030 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
22040 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
22050 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ead the content 
22060 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75 74  for page pPg out
22070 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
22080 20 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a   file and into .
22090 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41  ** pPg->pData. A
220a0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20   shared lock or 
220b0 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20  greater must be 
220c0 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
220d0 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66  base.** file bef
220e0 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
220f0 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
22100 2a 2a 20 49 66 20 70 61 67 65 20 31 20 69 73 20  ** If page 1 is 
22110 72 65 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76  read, then the v
22120 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
22130 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65  FileVers[] is se
22140 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75  t to.** the valu
22150 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
22160 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
22170 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
22180 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
22190 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73   the IO error is
221a0 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
221b0 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65   caller..** Othe
221c0 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
221d0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
221e0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
221f0 44 62 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  DbPage(PgHdr *pP
22200 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
22210 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
22220 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65  r; /* Pager obje
22230 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ct associated wi
22240 74 68 20 70 61 67 65 20 70 50 67 20 2a 2f 0a 20  th page pPg */. 
22250 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67   Pgno pgno = pPg
22260 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f 2a  ->pgno;       /*
22270 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
22280 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63  read */.  int rc
22290 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
222a0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
222b0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 36 34 20 69   code */.  i64 i
222c0 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
222d0 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
222e0 6f 66 66 73 65 74 20 6f 66 20 66 69 6c 65 20 74  offset of file t
222f0 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 0a  o read from */..
22300 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
22310 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
22320 48 41 52 45 44 20 26 26 20 21 4d 45 4d 44 42 20  HARED && !MEMDB 
22330 29 3b 0a 0a 20 20 69 66 28 20 21 69 73 4f 70 65  );..  if( !isOpe
22340 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
22350 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
22360 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
22370 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d  .    memset(pPg-
22380 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >pData, 0, pPage
22390 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
223a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
223b0 4f 4b 3b 0a 20 20 7d 0a 20 20 69 4f 66 66 73 65  OK;.  }.  iOffse
223c0 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
223d0 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
223e0 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ze;.  rc = sqlit
223f0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
22400 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c  >fd, pPg->pData,
22410 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
22420 65 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 69  e, iOffset);.  i
22430 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
22440 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
22450 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
22460 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
22470 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 75  pgno==1 ){.    u
22480 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d 20  8 *dbFileVers = 
22490 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74  &((u8*)pPg->pDat
224a0 61 29 5b 32 34 5d 3b 0a 20 20 20 20 6d 65 6d 63  a)[24];.    memc
224b0 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
224c0 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65  leVers, dbFileVe
224d0 72 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65  rs, sizeof(pPage
224e0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
224f0 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50  .  }.  CODEC1(pP
22500 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61  ager, pPg->pData
22510 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20  , pgno, 3, rc = 
22520 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a  SQLITE_NOMEM);..
22530 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
22540 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
22550 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45  b_count);.  PAGE
22560 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
22570 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45  Read);.  IOTRACE
22580 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22  (("PGIN %p %d\n"
22590 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
225a0 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
225b0 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25  "FETCH %d page %
225c0 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
225d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
225e0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
225f0 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67   pgno, pager_pag
22600 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20  ehash(pPg)));.. 
22610 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
22620 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
22630 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
22640 6e 65 76 65 72 20 74 68 65 20 75 70 70 65 72 20  never the upper 
22650 6c 61 79 65 72 20 72 65 71 75 65 73 74 73 20 61  layer requests a
22660 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 70 61 67   database.** pag
22670 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  e is requested, 
22680 62 65 66 6f 72 65 20 74 68 65 20 63 61 63 68 65  before the cache
22690 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20   is checked for 
226a0 61 20 73 75 69 74 61 62 6c 65 20 70 61 67 65 0a  a suitable page.
226b0 2a 2a 20 6f 72 20 61 6e 79 20 64 61 74 61 20 69  ** or any data i
226c0 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
226d0 64 61 74 61 62 61 73 65 2e 20 49 74 20 70 65 72  database. It per
226e0 66 6f 72 6d 73 20 74 68 65 20 66 6f 6c 6c 6f 77  forms the follow
226f0 69 6e 67 0a 2a 2a 20 74 77 6f 20 66 75 6e 63 74  ing.** two funct
22700 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  ions:.**.**   1)
22710 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
22720 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41   currently in PA
22730 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65  GER_UNLOCK state
22740 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a   (no lock held.*
22750 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61  *      on the da
22760 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68  tabase file), th
22770 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
22780 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20   made to obtain 
22790 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44  a.**      SHARED
227a0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
227b0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65  abase file. Imme
227c0 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62  diately after ob
227d0 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20  taining.**      
227e0 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
227f0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
22800 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20   is checked for 
22810 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a  a hot-journal,.*
22820 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73 20  *      which is 
22830 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20 70  played back if p
22840 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e  resent. Followin
22850 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61  g any hot-journa
22860 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62  l .**      rollb
22870 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  ack, the content
22880 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 61  s of the cache a
22890 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79 20  re validated by 
228a0 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20  checking.**     
228b0 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75   the 'change-cou
228c0 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74  nter' field of t
228d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
228e0 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20   header and.**  
228f0 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69 66      discarded if
22900 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20   they are found 
22910 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a  to be invalid..*
22920 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65  *.**   2) If the
22930 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
22940 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d  g in exclusive-m
22950 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61  ode, and there a
22960 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  re currently.** 
22970 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64       no outstand
22980 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
22990 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64  o any pages, and
229a0 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
229b0 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20   state,.**      
229c0 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
229d0 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72  is made to clear
229e0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
229f0 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a   by discarding.*
22a00 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65  *      the conte
22a10 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
22a20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e  cache and rollin
22a30 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20  g back any open 
22a40 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
22a50 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  file..**.** If t
22a60 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 64 65 73  he operation des
22a70 63 72 69 62 65 64 20 62 79 20 28 32 29 20 61 62  cribed by (2) ab
22a80 6f 76 65 20 69 73 20 6e 6f 74 20 61 74 74 65 6d  ove is not attem
22a90 70 74 65 64 2c 20 61 6e 64 20 69 66 20 74 68 65  pted, and if the
22aa0 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20  .** pager is in 
22ab0 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f  an error state o
22ac0 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
22ad0 5f 46 55 4c 4c 20 77 68 65 6e 20 74 68 69 73 20  _FULL when this 
22ae0 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 74 68  is called,.** th
22af0 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72  e error state er
22b00 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
22b10 72 6e 65 64 2e 20 49 74 20 69 73 20 70 65 72 6d  rned. It is perm
22b20 69 74 74 65 64 20 74 6f 20 72 65 61 64 20 74 68  itted to read th
22b30 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 68  e.** database wh
22b40 65 6e 20 69 6e 20 53 51 4c 49 54 45 5f 46 55 4c  en in SQLITE_FUL
22b50 4c 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a  L error state..*
22b60 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
22b70 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
22b80 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
22b90 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
22ba0 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 49 4f 20  ed. If an.** IO 
22bb0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
22bc0 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64  le locking the d
22bd0 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e  atabase, checkin
22be0 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  g for a hot-jour
22bf0 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 6f 72 20 72  nal.** file or r
22c00 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f  olling back a jo
22c10 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
22c20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
22c30 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
22c40 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 68  atic int pagerSh
22c50 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a  aredLock(Pager *
22c60 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
22c70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
22c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22c90 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
22ca0 20 20 69 6e 74 20 69 73 45 72 72 6f 72 52 65 73    int isErrorRes
22cb0 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  et = 0;         
22cc0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
22cd0 72 65 63 6f 76 65 72 69 6e 67 20 66 72 6f 6d 20  recovering from 
22ce0 65 72 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a 0a  error state */..
22cf0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
22d00 61 62 61 73 65 20 68 61 73 20 6e 6f 20 6f 75 74  abase has no out
22d10 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65  standing page re
22d20 66 65 72 65 6e 63 65 73 20 61 6e 64 20 69 73 20  ferences and is 
22d30 69 6e 20 61 6e 20 0a 20 20 2a 2a 20 65 72 72 6f  in an .  ** erro
22d40 72 2d 73 74 61 74 65 2c 20 74 68 69 73 20 69 73  r-state, this is
22d50 20 61 20 63 68 61 6e 63 65 20 74 6f 20 63 6c 65   a chance to cle
22d60 61 72 20 74 68 65 20 65 72 72 6f 72 2e 20 44 69  ar the error. Di
22d70 73 63 61 72 64 20 74 68 65 20 0a 20 20 2a 2a 20  scard the .  ** 
22d80 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
22d90 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20  pager-cache and 
22da0 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 68 6f 74  rollback any hot
22db0 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 74 68 65 0a   journal in the.
22dc0 20 20 2a 2a 20 66 69 6c 65 2d 73 79 73 74 65 6d    ** file-system
22dd0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 4d 45  ..  */.  if( !ME
22de0 4d 44 42 20 26 26 20 73 71 6c 69 74 65 33 50 63  MDB && sqlite3Pc
22df0 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
22e00 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
22e10 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
22e20 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20 69  ode ){.    if( i
22e30 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
22e40 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 7a 4a  d) || pPager->zJ
22e50 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
22e60 69 73 45 72 72 6f 72 52 65 73 65 74 20 3d 20 31  isErrorReset = 1
22e70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
22e80 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51  er->errCode = SQ
22e90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 70 61 67  LITE_OK;.    pag
22ea0 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
22eb0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
22ec0 68 65 20 70 61 67 65 72 20 69 73 20 73 74 69 6c  he pager is stil
22ed0 6c 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74  l in an error st
22ee0 61 74 65 2c 20 64 6f 20 6e 6f 74 20 70 72 6f 63  ate, do not proc
22ef0 65 65 64 2e 20 54 68 65 20 65 72 72 6f 72 20 0a  eed. The error .
22f00 20 20 2a 2a 20 73 74 61 74 65 20 77 69 6c 6c 20    ** state will 
22f10 62 65 20 63 6c 65 61 72 65 64 20 61 74 20 73 6f  be cleared at so
22f20 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
22f30 66 75 74 75 72 65 20 77 68 65 6e 20 61 6c 6c 20  future when all 
22f40 70 61 67 65 20 0a 20 20 2a 2a 20 72 65 66 65 72  page .  ** refer
22f50 65 6e 63 65 73 20 61 72 65 20 64 72 6f 70 70 65  ences are droppe
22f60 64 20 61 6e 64 20 74 68 65 20 63 61 63 68 65 20  d and the cache 
22f70 63 61 6e 20 62 65 20 64 69 73 63 61 72 64 65 64  can be discarded
22f80 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
22f90 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
22fa0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
22fb0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
22fc0 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
22fd0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
22fe0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
22ff0 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
23000 43 4b 20 7c 7c 20 69 73 45 72 72 6f 72 52 65 73  CK || isErrorRes
23010 65 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  et ){.    sqlite
23020 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
23030 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
23040 73 3b 0a 20 20 20 20 69 6e 74 20 69 73 48 6f 74  s;.    int isHot
23050 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
23060 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
23070 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
23080 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
23090 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
230a0 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ache)==0 );.    
230b0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52  if( !pPager->noR
230c0 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  eadlock ){.     
230d0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
230e0 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
230f0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
23100 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
23110 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23120 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
23130 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
23140 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20  NLOCK );.       
23150 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
23160 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
23170 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
23180 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  se if( pPager->s
23190 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
231a0 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  CK ){.      pPag
231b0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
231c0 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a  R_SHARED;.    }.
231d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
231e0 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45  er->state>=SHARE
231f0 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 20 20 2f  D_LOCK );..    /
23200 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  * If a journal f
23210 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20  ile exists, and 
23220 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45  there is no RESE
23230 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
23240 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
23250 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65   file, then it e
23260 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62  ither needs to b
23270 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72  e played back or
23280 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
23290 0a 20 20 20 20 69 66 28 20 21 69 73 45 72 72 6f  .    if( !isErro
232a0 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20  rReset ){.      
232b0 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e  rc = hasHotJourn
232c0 61 6c 28 70 50 61 67 65 72 2c 20 26 69 73 48 6f  al(pPager, &isHo
232d0 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  tJournal);.     
232e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
232f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
23300 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
23310 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
23320 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 7c 7c   isErrorReset ||
23330 20 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b   isHotJournal ){
23340 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e  .      /* Get an
23350 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
23360 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
23370 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f  file. At this po
23380 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20  int it is.      
23390 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  ** important tha
233a0 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
233b0 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65  k is not obtaine
233c0 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20  d on the way to 
233d0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43  the.      ** EXC
233e0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
233f0 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72  it were, another
23400 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f   process might o
23410 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  pen the.      **
23420 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
23430 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52  detect the RESER
23440 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f  VED lock, and co
23450 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a  nclude that the.
23460 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
23470 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61  e is safe to rea
23480 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f  d while this pro
23490 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f  cess is still ro
234a0 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20  lling the .     
234b0 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   ** hot-journal 
234c0 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a  back..      ** .
234d0 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65        ** Because
234e0 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
234f0 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
23500 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64  is not requested
23510 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f  , any.      ** o
23520 74 68 65 72 20 70 72 6f 63 65 73 73 20 61 74 74  ther process att
23530 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73  empting to acces
23540 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
23550 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20  ile will get to 
23560 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70  .      ** this p
23570 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
23580 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74   and fail to obt
23590 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c  ain its own EXCL
235a0 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20  USIVE lock .    
235b0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61    ** on the data
235c0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
235d0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
235e0 61 67 65 72 2d 3e 73 74 61 74 65 3c 45 58 43 4c  ager->state<EXCL
235f0 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
23600 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
23610 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
23620 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  >fd, EXCLUSIVE_L
23630 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  OCK);.        if
23640 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23650 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
23660 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  = pager_error(pP
23670 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
23680 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
23690 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
236a0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
236b0 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
236c0 49 56 45 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20  IVE;.      }. . 
236d0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65       /* Open the
236e0 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61   journal for rea
236f0 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20  d/write access. 
23700 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
23710 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 63  in .      ** exc
23720 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
23730 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  de the file desc
23740 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b  riptor will be k
23750 65 70 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20  ept open and.   
23760 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75     ** possibly u
23770 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61  sed for a transa
23780 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20  ction later on. 
23790 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c  On some systems,
237a0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 73   the.      ** Os
237b0 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20  Truncate() call 
237c0 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76  used in exclusiv
237d0 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 61 6c  e-access mode al
237e0 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  so requires.    
237f0 20 20 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74    ** a read/writ
23800 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20  e file handle.. 
23810 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
23820 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
23830 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
23840 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20    int res;.     
23850 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
23860 73 41 63 63 65 73 73 28 70 56 66 73 2c 70 50 61  sAccess(pVfs,pPa
23870 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51  ger->zJournal,SQ
23880 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
23890 54 53 2c 26 72 65 73 29 3b 0a 20 20 20 20 20 20  TS,&res);.      
238a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
238b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
238c0 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
238d0 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74          int fout
238e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
238f0 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45    int f = SQLITE
23900 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
23910 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
23920 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
23930 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
23940 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
23950 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
23960 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
23970 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
23980 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
23990 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29  ->jfd, f, &fout)
239a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
239b0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
239c0 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50  _OK || isOpen(pP
239d0 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
239e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
239f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66  ==SQLITE_OK && f
23a00 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  out&SQLITE_OPEN_
23a10 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20  READONLY ){.    
23a20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
23a30 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
23a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
23a50 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
23a60 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
23a70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23a80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23a90 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
23aa0 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
23ab0 20 65 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c   exist, it usual
23ac0 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f  ly means that so
23ad0 6d 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  me .            
23ae0 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
23af0 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67  ion managed to g
23b00 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69  et in and roll i
23b10 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20  t back before . 
23b20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
23b30 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62  is connection ob
23b40 74 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75  tained the exclu
23b50 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e  sive lock above.
23b60 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20 20   Or, it .       
23b70 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e       ** may mean
23b80 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
23b90 77 61 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72  was in the error
23ba0 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73  -state when this
23bb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
23bc0 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
23bd0 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  led and the jour
23be0 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
23bf0 74 20 65 78 69 73 74 2e 20 20 2a 2f 0a 20 20 20  t exist.  */.   
23c00 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
23c10 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
23c20 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ion(pPager, 0);.
23c30 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23c40 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
23c50 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
23c60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
23c70 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
23c80 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
23c90 54 4f 44 4f 3a 20 57 68 79 20 61 72 65 20 74 68  TODO: Why are th
23ca0 65 73 65 20 63 6c 65 61 72 65 64 20 68 65 72 65  ese cleared here
23cb0 3f 20 49 73 20 69 74 20 6e 65 63 65 73 73 61 72  ? Is it necessar
23cc0 79 3f 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67  y? */.      pPag
23cd0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
23ce0 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ed = 0;.      pP
23cf0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
23d00 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
23d10 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
23d20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
23d30 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
23d40 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79  . .      /* Play
23d50 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20  back and delete 
23d60 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72  the journal.  Dr
23d70 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  op the database 
23d80 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c  write.      ** l
23d90 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
23da0 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
23db0 20 50 75 72 67 65 20 74 68 65 20 63 61 63 68 65   Purge the cache
23dc0 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a   before.      **
23dd0 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
23de0 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f  e hot-journal so
23df0 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65   that we don't e
23e00 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20 20 20  nd up with.     
23e10 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   ** an inconsist
23e20 65 6e 74 20 63 61 63 68 65 2e 0a 20 20 20 20 20  ent cache..     
23e30 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
23e40 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
23e50 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
23e60 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
23e70 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
23e80 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
23e90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23ea0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
23eb0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
23ec0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
23ed0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20   failed;.       
23ee0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
23ef0 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
23f00 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
23f10 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 20 20  HARED).         
23f20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78    || (pPager->ex
23f30 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70  clusiveMode && p
23f40 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 50 41 47  Pager->state>PAG
23f50 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20  ER_SHARED).     
23f60 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   );.    }..    i
23f70 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  f( pPager->pBack
23f80 75 70 20 7c 7c 20 73 71 6c 69 74 65 33 50 63 61  up || sqlite3Pca
23f90 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61  chePagecount(pPa
23fa0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20  ger->pPCache)>0 
23fb0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
23fc0 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20  shared-lock has 
23fd0 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72  just been acquir
23fe0 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
23ff0 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  se file.      **
24000 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61   and there are a
24010 6c 72 65 61 64 79 20 70 61 67 65 73 20 69 6e 20  lready pages in 
24020 74 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20  the cache (from 
24030 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20  a previous.     
24040 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74   ** read or writ
24050 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20  e transaction). 
24060 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
24070 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
24080 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20      ** has been 
24090 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74 68  modified.  If th
240a0 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 63  e database has c
240b0 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74 68  hanged, flush th
240c0 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65  e.      ** cache
240d0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
240e0 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61   ** Database cha
240f0 6e 67 65 73 20 69 73 20 64 65 74 65 63 74 65 64  nges is detected
24100 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31   by looking at 1
24110 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e  5 bytes beginnin
24120 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66  g.      ** at of
24130 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65  fset 24 into the
24140 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73   file.  The firs
24150 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20  t 4 of these 16 
24160 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20  bytes are.      
24170 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e  ** a 32-bit coun
24180 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72  ter that is incr
24190 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63  emented with eac
241a0 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20  h change.  The. 
241b0 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79       ** other by
241c0 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f  tes change rando
241d0 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69  mly with each fi
241e0 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20  le change when. 
241f0 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20       ** a codec 
24200 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20  is in use..     
24210 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68   ** .      ** Th
24220 65 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69  ere is a vanishi
24230 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63  ngly small chanc
24240 65 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20  e that a change 
24250 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20  will not be .   
24260 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20     ** detected. 
24270 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61   The chance of a
24280 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61  n undetected cha
24290 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20  nge is so small 
242a0 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74  that.      ** it
242b0 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65   can be neglecte
242c0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
242d0 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72    char dbFileVer
242e0 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  s[sizeof(pPager-
242f0 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20  >dbFileVers)];. 
24300 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
24310 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
24320 72 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 69 66  r, 0);..      if
24330 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
24340 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
24350 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
24360 65 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  e;.        goto 
24370 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
24380 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
24390 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
243a0 69 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  id );.      if( 
243b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30  pPager->dbSize>0
243c0 20 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52   ){.        IOTR
243d0 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20  ACE(("CKVERS %p 
243e0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73  %d\n", pPager, s
243f0 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
24400 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  )));.        rc 
24410 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
24420 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46  pPager->fd, &dbF
24430 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
24440 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29  dbFileVers), 24)
24450 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
24460 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
24470 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61           goto fa
24480 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  iled;.        }.
24490 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
244a0 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69       memset(dbFi
244b0 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f  leVers, 0, sizeo
244c0 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  f(dbFileVers));.
244d0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
244e0 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72  f( memcmp(pPager
244f0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
24500 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
24510 28 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30  (dbFileVers))!=0
24520 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
24530 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
24540 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
24550 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
24560 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
24570 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
24580 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e==PAGER_SHARED 
24590 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a  );.  }.. failed:
245a0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
245b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 70  E_OK ){.    /* p
245c0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73  ager_unlock() is
245d0 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 65 78 63   a no-op for exc
245e0 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20  lusive mode and 
245f0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
24600 73 65 73 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65  ses. */.    page
24610 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
24620 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
24630 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  c;.}../*.** If t
24640 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
24650 6e 74 20 68 61 73 20 72 65 61 63 68 65 64 20 7a  nt has reached z
24660 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ero, rollback an
24670 79 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e  y active.** tran
24680 73 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f  saction and unlo
24690 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a  ck the pager..**
246a0 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c  .** Except, in l
246b0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
246c0 55 53 49 56 45 20 77 68 65 6e 20 74 68 65 72 65  USIVE when there
246d0 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69   is nothing to i
246e0 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  n.** the rollbac
246f0 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75  k journal, the u
24700 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72  nlock is not per
24710 66 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65  formed and there
24720 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74   is.** nothing t
24730 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74  o rollback, so t
24740 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
24750 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74   no-op..*/ .stat
24760 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
24770 6f 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65  ockIfUnused(Page
24780 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
24790 28 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65  ( (sqlite3Pcache
247a0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
247b0 3e 70 50 43 61 63 68 65 29 3d 3d 30 29 0a 20 20  >pPCache)==0).  
247c0 20 26 26 20 28 21 70 50 61 67 65 72 2d 3e 65 78   && (!pPager->ex
247d0 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
247e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
247f0 66 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70  f>0) .  ){.    p
24800 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
24810 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
24820 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 72 6f 70   }.}../*.** Drop
24830 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
24840 20 63 61 63 68 65 20 75 73 69 6e 67 20 73 71 6c   cache using sql
24850 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 29  ite3PcacheDrop()
24860 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
24870 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65 20  means there are 
24880 6e 6f 77 20 6e 6f 20 70 61 67 65 73 20 77 69 74  now no pages wit
24890 68 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  h references to 
248a0 74 68 65 6d 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  them, a rollback
248b0 0a 2a 2a 20 6f 63 63 75 72 73 20 61 6e 64 20 74  .** occurs and t
248c0 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  he lock on the d
248d0 61 74 61 62 61 73 65 20 69 73 20 72 65 6d 6f 76  atabase is remov
248e0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
248f0 69 64 20 70 61 67 65 72 44 72 6f 70 50 61 67 65  id pagerDropPage
24900 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
24910 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
24920 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
24930 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f  sqlite3PcacheDro
24940 70 28 70 50 67 29 3b 0a 20 20 70 61 67 65 72 55  p(pPg);.  pagerU
24950 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50  nlockIfUnused(pP
24960 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ager);.}../*.** 
24970 41 63 71 75 69 72 65 20 61 20 72 65 66 65 72 65  Acquire a refere
24980 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  nce to page numb
24990 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65 72  er pgno in pager
249a0 20 70 50 61 67 65 72 20 28 61 20 70 61 67 65 0a   pPager (a page.
249b0 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61 73  ** reference has
249c0 20 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e 20   type DbPage*). 
249d0 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
249e0 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a   reference is .*
249f0 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  * successfully o
24a00 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63  btained, it is c
24a10 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65  opied to *ppPage
24a20 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
24a30 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
24a40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  his function cal
24a50 6c 73 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f  ls pagerSharedLo
24a60 63 6b 28 29 20 74 6f 20 6f 62 74 61 69 6e 20 61  ck() to obtain a
24a70 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 0a   SHARED lock on.
24a80 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
24a90 66 69 6c 65 20 69 66 20 73 75 63 68 20 61 20 6c  file if such a l
24aa0 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 69  ock or greater i
24ab0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 65  s not already he
24ac0 6c 64 2e 0a 2a 2a 20 54 68 69 73 20 6d 61 79 20  ld..** This may 
24ad0 63 61 75 73 65 20 68 6f 74 2d 6a 6f 75 72 6e 61  cause hot-journa
24ae0 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20  l rollback or a 
24af0 63 61 63 68 65 20 70 75 72 67 65 2e 20 53 65 65  cache purge. See
24b00 20 63 6f 6d 6d 65 6e 74 73 0a 2a 2a 20 61 62 6f   comments.** abo
24b10 76 65 20 66 75 6e 63 74 69 6f 6e 20 70 61 67 65  ve function page
24b20 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 66 6f  rSharedLock() fo
24b30 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a  r details..**.**
24b40 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
24b50 64 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  d page is alread
24b60 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  y in the cache, 
24b70 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  it is returned. 
24b80 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
24b90 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74   new page object
24ba0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
24bb0 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
24bc0 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72   data.** read fr
24bd0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
24be0 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61  file. In some ca
24bf0 73 65 73 2c 20 74 68 65 20 70 63 61 63 68 65 20  ses, the pcache 
24c00 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68  module may.** ch
24c10 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f  oose not to allo
24c20 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  cate a new page 
24c30 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72  object and may r
24c40 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  euse an existing
24c50 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20  .** object with 
24c60 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
24c70 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a  eferences..**.**
24c80 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20   The extra data 
24c90 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61  appended to a pa
24ca0 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69  ge is always ini
24cb0 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f  tialized to zero
24cc0 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20  s the .** first 
24cd0 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c  time a page is l
24ce0 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72  oaded into memor
24cf0 79 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 72  y. If the page r
24d00 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20  equested is .** 
24d10 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
24d20 61 63 68 65 20 77 68 65 6e 20 74 68 69 73 20 66  ache when this f
24d30 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
24d40 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74 72  d, then the extr
24d50 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66  a.** data is lef
24d60 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e  t as it was when
24d70 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74   the page object
24d80 20 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a   was last used..
24d90 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
24da0 61 62 61 73 65 20 69 6d 61 67 65 20 69 73 20 73  abase image is s
24db0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
24dc0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 6f  requested page o
24dd0 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a  r if a .** non-z
24de0 65 72 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73  ero value is pas
24df0 73 65 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e  sed as the noCon
24e00 74 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61  tent parameter a
24e10 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65  nd the .** reque
24e20 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
24e30 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20   already stored 
24e40 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74 68  in the cache, th
24e50 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c  en no .** actual
24e60 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72   disk read occur
24e70 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
24e80 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
24e90 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   of the .** page
24ea0 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
24eb0 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a  to all zeros. .*
24ec0 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  *.** If noConten
24ed0 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65  t is true, it me
24ee0 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
24ef0 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ot care about th
24f00 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66  e contents.** of
24f10 20 74 68 65 20 70 61 67 65 2e 20 54 68 69 73 20   the page. This 
24f20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20 73 65  occurs in two se
24f30 70 65 72 61 74 65 20 73 63 65 6e 61 72 69 6f 73  perate scenarios
24f40 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65  :.**.**   a) Whe
24f50 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72 65 65  n reading a free
24f60 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
24f70 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
24f80 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62  e, and.**.**   b
24f90 29 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69  ) When a savepoi
24fa0 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  nt is being roll
24fb0 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e  ed back and we n
24fc0 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20  eed to load.**  
24fd0 20 20 20 20 61 20 6e 65 77 20 70 61 67 65 20 69      a new page i
24fe0 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f  nto the cache to
24ff0 20 70 6f 70 75 6c 61 74 65 20 77 69 74 68 20 74   populate with t
25000 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20  he data read.** 
25010 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61       from the sa
25020 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e  vepoint journal.
25030 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  .**.** If noCont
25040 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65  ent is true, the
25050 6e 20 74 68 65 20 64 61 74 61 20 72 65 74 75 72  n the data retur
25060 6e 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e  ned is zeroed in
25070 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e  stead of.** bein
25080 67 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  g read from the 
25090 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69  database. Additi
250a0 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73  onally, the bits
250b0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
250c0 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67  * to pgno in Pag
250d0 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62  er.pInJournal (b
250e0 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61  itvec of pages a
250f0 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e 20 74  lready written t
25100 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  o the.** journal
25110 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50   file) and the P
25120 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
25130 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65  nSavepoint bitve
25140 63 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a  cs of any open.*
25150 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  * savepoints are
25160 20 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73   set. This means
25170 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
25180 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 61 74  made writable at
25190 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e   any.** point in
251a0 20 74 68 65 20 66 75 74 75 72 65 2c 20 75 73 69   the future, usi
251b0 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  ng a call to sql
251c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
251d0 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a  , its contents.*
251e0 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f  * will not be jo
251f0 75 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61  urnaled. This sa
25200 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68  ves IO..**.** Th
25210 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
25220 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
25230 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
25240 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
25250 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
25260 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
25270 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
25280 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
25290 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
252a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
252b0 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69  kup().  Both thi
252c0 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f  s routine and Lo
252d0 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a  okup() attempt.*
252e0 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  * to find a page
252f0 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
25300 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20  y cache first.  
25310 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
25320 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
25330 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f   memory, this ro
25340 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69  utine goes to di
25350 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e  sk to read it in
25360 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28   whereas Lookup(
25370 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e  ).** just return
25380 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69  s 0.  This routi
25390 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65  ne acquires a re
253a0 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73  ad-lock the firs
253b0 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73  t time it.** has
253c0 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20   to go to disk, 
253d0 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70  and could also p
253e0 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a  layback an old j
253f0 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
25400 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f  ary..** Since Lo
25410 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65  okup() never goe
25420 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65  s to disk, it ne
25430 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20  ver has to deal 
25440 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72  with locks.** or
25450 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
25460 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
25470 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61  gerAcquire(.  Pa
25480 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
25490 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
254a0 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
254b0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
254c0 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
254d0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
254e0 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44   to fetch */.  D
254f0 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  bPage **ppPage, 
25500 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f     /* Write a po
25510 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
25520 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
25530 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20  noContent       
25540 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72  /* Do not bother
25550 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74   reading content
25560 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72   from disk if tr
25570 75 65 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72  ue */.){.  PgHdr
25580 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 69 6e 74   *pPg = 0;.  int
25590 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
255a0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
255b0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
255c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
255d0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
255e0 4f 43 4b 20 0a 20 20 20 20 20 20 20 7c 7c 20 73  OCK .       || s
255f0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
25600 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
25610 61 63 68 65 29 3e 30 20 0a 20 20 20 20 20 20 20  ache)>0 .       
25620 7c 7c 20 70 67 6e 6f 3d 3d 31 0a 20 20 29 3b 0a  || pgno==1.  );.
25630 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75  .  /* The maximu
25640 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  m page number is
25650 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51   2^31. Return SQ
25660 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
25670 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62  a page.  ** numb
25680 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
25690 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69  this, or zero, i
256a0 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a  s requested..  *
256b0 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47  /.  if( pgno>PAG
256c0 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70  ER_MAX_PGNO || p
256d0 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
256e0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
256f0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74  ager) ){.    ret
25700 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
25710 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
25720 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  /* Make sure we 
25730 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79  have not hit any
25740 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73   critical errors
25750 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74  ..  */ .  assert
25760 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
25770 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20   *ppPage = 0;.. 
25780 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
25790 68 65 20 66 69 72 73 74 20 70 61 67 65 20 61 63  he first page ac
257a0 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65 74  cessed, then get
257b0 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20   a SHARED lock. 
257c0 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62   ** on the datab
257d0 61 73 65 20 66 69 6c 65 2e 20 70 61 67 65 72 53  ase file. pagerS
257e0 68 61 72 65 64 4c 6f 63 6b 28 29 20 69 73 20 61  haredLock() is a
257f0 20 6e 6f 2d 6f 70 20 69 66 20 0a 20 20 2a 2a 20   no-op if .  ** 
25800 61 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20  a database lock 
25810 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2e  is already held.
25820 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
25830 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 50 61  erSharedLock(pPa
25840 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
25850 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25860 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
25870 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
25880 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
25890 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 72 63 20 3d  NLOCK );..  rc =
258a0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
258b0 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
258c0 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 26 70  che, pgno, 1, &p
258d0 50 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  Pg);.  if( rc!=S
258e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
258f0 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
25900 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 20  sed(pPager);.   
25910 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
25920 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
25930 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61  gno==pgno );.  a
25940 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
25950 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 70 50  er==pPager || pP
25960 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a  g->pPager==0 );.
25970 20 20 69 66 28 20 70 50 67 2d 3e 70 50 61 67 65    if( pPg->pPage
25980 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  r==0 ){.    /* T
25990 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 68  he pager cache h
259a0 61 73 20 63 72 65 61 74 65 64 20 61 20 6e 65 77  as created a new
259b0 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65   page. Its conte
259c0 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20  nt needs to .   
259d0 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a   ** be initializ
259e0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
259f0 6e 74 20 6e 4d 61 78 3b 0a 20 20 20 20 50 41 47  nt nMax;.    PAG
25a00 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
25a10 6e 4d 69 73 73 29 3b 0a 20 20 20 20 70 50 67 2d  nMiss);.    pPg-
25a20 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
25a30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
25a40 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
25a50 74 28 70 50 61 67 65 72 2c 20 26 6e 4d 61 78 29  t(pPager, &nMax)
25a60 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
25a70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
25a80 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
25a90 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 72  ef(pPg);.      r
25aa0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
25ab0 0a 20 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69  .    if( nMax<(i
25ac0 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42  nt)pgno || MEMDB
25ad0 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b   || noContent ){
25ae0 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  .      if( pgno>
25af0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
25b00 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
25b10 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
25b20 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
25b30 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
25b40 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
25b50 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
25b60 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20       /* Failure 
25b70 74 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 20  to set the bits 
25b80 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c  in the InJournal
25b90 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20   bit-vectors is 
25ba0 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20  benign..        
25bb0 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61  ** It merely mea
25bc0 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67 68 74  ns that we might
25bd0 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77   do some extra w
25be0 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61  ork to journal a
25bf0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67   .        ** pag
25c00 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
25c10 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e  need to be journ
25c20 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c  aled.  Neverthel
25c30 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20  ess, be sure .  
25c40 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74        ** to test
25c50 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20   the case where 
25c60 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  a malloc error o
25c70 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
25c80 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20  ng to set .     
25c90 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61     ** a bit in a
25ca0 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20   bit vector..   
25cb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
25cc0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
25cd0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
25ce0 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50      if( pgno<=pP
25cf0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
25d00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45   ){.          TE
25d10 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73  STONLY( rc = ) s
25d20 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
25d30 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
25d40 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  al, pgno);.     
25d50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
25d60 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
25d70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
25d80 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72       TESTONLY( r
25d90 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70  c = ) addToSavep
25da0 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
25db0 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  er, pgno);.     
25dc0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
25dd0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
25de0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
25df0 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
25e00 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
25e10 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
25e20 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50  Pg->pData, 0, pP
25e30 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
25e40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 49  .      }.      I
25e50 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70  OTRACE(("ZERO %p
25e60 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
25e70 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73  pgno));.    }els
25e80 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
25e90 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
25ea0 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20 72 63  ager );.      rc
25eb0 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50   = readDbPage(pP
25ec0 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
25ed0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
25ee0 20 20 20 20 20 20 20 70 61 67 65 72 44 72 6f 70         pagerDrop
25ef0 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
25f00 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
25f10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64      }.    }.#ifd
25f20 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
25f30 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70  PAGES.    pPg->p
25f40 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
25f50 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
25f60 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
25f70 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
25f80 74 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74  ted page is in t
25f90 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a  he page cache. *
25fa0 2f 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52  /.    PAGER_INCR
25fb0 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a  (pPager->nHit);.
25fc0 20 20 7d 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d    }..  *ppPage =
25fd0 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53   pPg;.  return S
25fe0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
25ff0 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
26000 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  e if it is alrea
26010 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  dy in the in-mem
26020 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a  ory cache.  Do.*
26030 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70  * not read the p
26040 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20  age from disk.  
26050 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
26060 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a   to the page,.**
26070 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67   or 0 if the pag
26080 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
26090 65 2e 20 41 6c 73 6f 2c 20 72 65 74 75 72 6e 20  e. Also, return 
260a0 30 20 69 66 20 74 68 65 20 0a 2a 2a 20 70 61 67  0 if the .** pag
260b0 65 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f 55  er is in PAGER_U
260c0 4e 4c 4f 43 4b 20 73 74 61 74 65 20 77 68 65 6e  NLOCK state when
260d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
260e0 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 6f 72 20  s called,.** or 
260f0 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
26100 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
26110 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  e other than SQL
26120 49 54 45 5f 46 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  ITE_FULL..**.** 
26130 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
26140 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68 65  PagerGet().  The
26150 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
26160 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
26170 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50  .** and sqlite3P
26180 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68 61  agerGet() is tha
26190 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f  t _get() will go
261a0 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64   to the disk and
261b0 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20   read.** in the 
261c0 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65  page if the page
261d0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
261e0 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  in cache.  This 
261f0 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
26200 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70  ns NULL if the p
26210 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
26220 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b  che or if a disk
26230 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68   I/O error .** h
26240 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64  as ever happened
26250 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c  ..*/.DbPage *sql
26260 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
26270 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
26280 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
26290 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 61  dr *pPg = 0;.  a
262a0 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
262b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
262c0 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  no!=0 );..  if( 
262d0 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d  (pPager->state!=
262e0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 0a 20 20  PAGER_UNLOCK).  
262f0 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 72 72   && (pPager->err
26300 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
26310 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
26320 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29  de==SQLITE_FULL)
26330 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
26340 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
26350 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
26360 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20 20  no, 0, &pPg);.  
26370 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b  }..  return pPg;
26380 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
26390 65 20 61 20 70 61 67 65 20 72 65 66 65 72 65 6e  e a page referen
263a0 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ce..**.** If the
263b0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
263c0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
263d0 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20  e drop to zero, 
263e0 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65  then the.** page
263f0 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
26400 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e   LRU list.  When
26410 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20   all references 
26420 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20  to all pages.** 
26430 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20  are released, a 
26440 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
26450 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
26460 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a  the database is.
26470 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76  ** removed..*/.v
26480 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
26490 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70 50  Unref(DbPage *pP
264a0 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29 7b  g){.  if( pPg ){
264b0 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
264c0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
264d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
264e0 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b  cheRelease(pPg);
264f0 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
26500 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29  IfUnused(pPager)
26510 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
26520 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
26530 61 6c 20 66 69 6c 65 20 68 61 73 20 61 6c 72 65  al file has alre
26540 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  ady been opened,
26550 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
26560 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  .** sub-journal 
26570 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 74 6f 6f  file is open too
26580 2e 20 49 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  . If the main jo
26590 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 6f 70 65  urnal is not ope
265a0 6e 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  n,.** this funct
265b0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
265c0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
265d0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 65  is returned if e
265e0 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61  verything goes a
265f0 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e  ccording to plan
26600 2e 20 0a 2a 2a 20 41 6e 20 53 51 4c 49 54 45 5f  . .** An SQLITE_
26610 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20  IOERR_XXX error 
26620 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
26630 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 0a 2a   if a call to .*
26640 2a 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  * sqlite3OsOpen(
26650 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  ) fails..*/.stat
26660 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f  ic int openSubJo
26670 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
26680 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
26690 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
266a0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
266b0 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e  >jfd) && !isOpen
266c0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
266d0 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
266e0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
266f0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
26700 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65  _MEMORY || pPage
26710 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  r->subjInMemory 
26720 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
26730 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70  MemJournalOpen(p
26740 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20  Pager->sjfd);.  
26750 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
26760 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d  c = pagerOpentem
26770 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  p(pPager, pPager
26780 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f  ->sjfd, SQLITE_O
26790 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b  PEN_SUBJOURNAL);
267a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
267b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
267c0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
267d0 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20  s called at the 
267e0 73 74 61 72 74 20 6f 66 20 65 76 65 72 79 20 77  start of every w
267f0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
26800 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  ..** There must 
26810 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53  already be a RES
26820 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
26830 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
26840 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65  atabase .** file
26850 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
26860 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
26870 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75  .** Open the jou
26880 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
26890 67 65 72 20 70 50 61 67 65 72 20 61 6e 64 20 77  ger pPager and w
268a0 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68  rite a journal h
268b0 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  eader.** to the 
268c0 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20  start of it. If 
268d0 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
268e0 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65   savepoints, ope
268f0 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  n the sub-journa
26900 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68  l.** as well. Th
26910 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
26920 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74 68  nly used when th
26930 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
26940 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e  s being .** open
26950 65 64 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f  ed to write a ro
26960 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61  llback log for a
26970 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74   transaction. It
26980 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a   is not used .**
26990 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   when opening a 
269a0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot journal file
269b0 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
269c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
269d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61  ournal file is a
269e0 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20  lready open (as 
269f0 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63  it may be in exc
26a00 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a  lusive mode),.**
26a10 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
26a20 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20  ion just writes 
26a30 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  a journal header
26a40 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
26a50 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20   the.** already 
26a60 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  open file. .**.*
26a70 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * Whether or not
26a80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
26a90 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74  e is opened by t
26aa0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  his function, th
26ab0 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f  e.** Pager.pInJo
26ac0 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72  urnal bitvec str
26ad0 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61  ucture is alloca
26ae0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ted..**.** Retur
26af0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
26b00 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
26b10 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69  cessful. Otherwi
26b20 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  se, return .** S
26b30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74  QLITE_NOMEM if t
26b40 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c  he attempt to al
26b50 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e  locate Pager.pIn
26b60 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f  Journal fails, o
26b70 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f  r .** an IO erro
26b80 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e  r code if openin
26b90 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  g or writing the
26ba0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61   journal file fa
26bb0 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
26bc0 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f  nt pager_open_jo
26bd0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
26be0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
26bf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
26c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c10 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
26c20 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  e */.  sqlite3_v
26c30 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
26c40 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20  = pPager->pVfs; 
26c50 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
26c60 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20   of vfs pointer 
26c70 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
26c80 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
26c90 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
26ca0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
26cb0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
26cc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
26cd0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
26ce0 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72  ;.  .  /* If alr
26cf0 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f  eady in the erro
26d00 72 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75  r state, this fu
26d10 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
26d20 70 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  p. */.  if( pPag
26d30 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
26d40 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
26d50 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a  ->errCode;.  }..
26d60 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74    /* TODO: Is it
26d70 20 72 65 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65   really possible
26d80 20 74 6f 20 67 65 74 20 68 65 72 65 20 77 69 74   to get here wit
26d90 68 20 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30  h dbSizeValid==0
26da0 3f 20 49 66 20 6e 6f 74 2c 0a 20 20 2a 2a 20 74  ? If not,.  ** t
26db0 68 65 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72  he call to Pager
26dc0 50 61 67 65 63 6f 75 6e 74 28 29 20 63 61 6e 20  Pagecount() can 
26dd0 62 65 20 72 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f  be removed..  */
26de0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61  .  testcase( pPa
26df0 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
26e00 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ==0 );.  sqlite3
26e10 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
26e20 50 61 67 65 72 2c 20 30 29 3b 0a 0a 20 20 70 50  Pager, 0);..  pP
26e30 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
26e40 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
26e50 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64  Create(pPager->d
26e60 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 70 50  bSize);.  if( pP
26e70 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
26e80 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
26e90 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
26ea0 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74    }..  /* Open t
26eb0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
26ec0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
26ed0 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20  eady open. */.  
26ee0 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
26ef0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
26f00 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
26f10 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
26f20 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
26f30 59 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  Y ){.      sqlit
26f40 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e  e3MemJournalOpen
26f50 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
26f60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26f70 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
26f80 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =               
26f90 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73      /* VFS flags
26fa0 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c   to open journal
26fb0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20   file */.       
26fc0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
26fd0 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
26fe0 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20  EN_CREATE|.     
26ff0 20 20 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70     (pPager->temp
27000 46 69 6c 65 20 3f 20 0a 20 20 20 20 20 20 20 20  File ? .        
27010 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44    (SQLITE_OPEN_D
27020 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c  ELETEONCLOSE|SQL
27030 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
27040 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20 20 20  URNAL):.        
27050 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d    (SQLITE_OPEN_M
27060 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20  AIN_JOURNAL).   
27070 20 20 20 20 20 29 3b 0a 23 69 66 64 65 66 20 53       );.#ifdef S
27080 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
27090 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20  MIC_WRITE.      
270a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72  rc = sqlite3Jour
270b0 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 20  nalOpen(.       
270c0 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d     pVfs, pPager-
270d0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
270e0 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a  r->jfd, flags, j
270f0 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50  rnlBufferSize(pP
27100 61 67 65 72 29 0a 20 20 20 20 20 20 29 3b 0a 23  ager).      );.#
27110 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20  else.      rc = 
27120 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
27130 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
27140 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
27150 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65  d, flags, 0);.#e
27160 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 61  ndif.    }.    a
27170 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
27180 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
27190 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
271a0 20 7d 0a 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20   }...  /* Write 
271b0 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
271c0 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20  l header to the 
271d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64  journal file and
271e0 20 6f 70 65 6e 20 0a 20 20 2a 2a 20 74 68 65 20   open .  ** the 
271f0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  sub-journal if n
27200 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
27210 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27220 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 4f 44  OK ){.    /* TOD
27230 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c 6c 20  O: Check if all 
27240 6f 66 20 74 68 65 73 65 20 61 72 65 20 72 65 61  of these are rea
27250 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20 2a 2f  lly required. */
27260 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f  .    pPager->dbO
27270 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72  rigSize = pPager
27280 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 70 50  ->dbSize;.    pP
27290 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
272a0 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 50  rted = 0;.    pP
272b0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
272c0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
272d0 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  nRec = 0;.    pP
272e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
272f0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
27300 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
27310 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
27320 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20  rnalHdr = 0;.   
27330 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
27340 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
27350 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
27360 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
27370 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ->nSavepoint ){.
27380 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62      rc = openSub
27390 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
273a0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
273b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
273c0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
273d0 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
273e0 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70  nJournal);.    p
273f0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
27400 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  l = 0;.  }.  ret
27410 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
27420 20 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74   Begin a write-t
27430 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
27440 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
27450 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a  r object. If a .
27460 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ** write-transac
27470 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
27480 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68   been opened, th
27490 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
274a0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
274b0 20 74 68 65 20 65 78 46 6c 61 67 20 61 72 67 75   the exFlag argu
274c0 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74  ment is false, t
274d0 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c  hen acquire at l
274e0 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44 0a  east a RESERVED.
274f0 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ** lock on the d
27500 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
27510 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c   exFlag is true,
27520 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74   then acquire at
27530 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43   least.** an EXC
27540 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
27550 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61  such a lock is a
27560 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20  lready held, no 
27570 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63  locking .** func
27580 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61  tions need be ca
27590 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lled..**.** If t
275a0 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d  his is not a tem
275b0 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d  porary or in-mem
275c0 6f 72 79 20 66 69 6c 65 20 61 6e 64 2c 20 74 68  ory file and, th
275d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
275e0 73 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 69 66 20  s .** opened if 
275f0 69 74 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  it has not been 
27600 61 6c 72 65 61 64 79 2e 20 46 6f 72 20 61 20 74  already. For a t
27610 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 20 74  emporary file, t
27620 68 65 20 6f 70 65 6e 69 6e 67 20 0a 2a 2a 20 6f  he opening .** o
27630 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
27640 6c 65 20 69 73 20 64 65 66 65 72 72 65 64 20 75  le is deferred u
27650 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e  ntil there is an
27660 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20   actual need to 
27670 0a 2a 2a 20 77 72 69 74 65 20 74 6f 20 74 68 65  .** write to the
27680 20 6a 6f 75 72 6e 61 6c 2e 20 54 4f 44 4f 3a 20   journal. TODO: 
27690 57 68 79 20 68 61 6e 64 6c 65 20 74 65 6d 70 6f  Why handle tempo
276a0 72 61 72 79 20 66 69 6c 65 73 20 64 69 66 66 65  rary files diffe
276b0 72 65 6e 74 6c 79 3f 0a 2a 2a 0a 2a 2a 20 49 66  rently?.**.** If
276c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
276d0 65 20 69 73 20 6f 70 65 6e 65 64 20 28 6f 72 20  e is opened (or 
276e0 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
276f0 20 6f 70 65 6e 29 2c 20 74 68 65 6e 20 61 0a 2a   open), then a.*
27700 2a 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  * journal-header
27710 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
27720 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e 0a  he start of it..
27730 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62  **.** If the sub
27740 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65  jInMemory argume
27750 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  nt is non-zero, 
27760 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75  then any sub-jou
27770 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77  rnal opened.** w
27780 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
27790 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f  action will be o
277a0 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
277b0 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73  emory file. This
277c0 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63  .** has no effec
277d0 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75  t if the sub-jou
277e0 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20  rnal is already 
277f0 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61  opened (as it ma
27800 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e  y be when.** run
27810 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
27820 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68  e mode) or if th
27830 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f  e transaction do
27840 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
27850 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  .** sub-journal.
27860 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65   If the subjInMe
27870 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73  mory argument is
27880 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20   zero, then any 
27890 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d  required.** sub-
278a0 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65  journal is imple
278b0 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79  mented in-memory
278c0 20 69 66 20 70 50 61 67 65 72 20 69 73 20 61 6e   if pPager is an
278d0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
278e0 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e  ase, .** or usin
278f0 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  g a temporary fi
27900 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  le otherwise..*/
27910 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
27920 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50  rBegin(Pager *pP
27930 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67  ager, int exFlag
27940 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f  , int subjInMemo
27950 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ry){.  int rc = 
27960 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
27970 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
27980 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
27990 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75   );.  pPager->su
279a0 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38  bjInMemory = (u8
279b0 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 20  )subjInMemory;. 
279c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
279d0 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te==PAGER_SHARED
279e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
279f0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
27a00 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  al==0 );.    ass
27a10 65 72 74 28 20 21 4d 45 4d 44 42 20 26 26 20 21  ert( !MEMDB && !
27a20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
27a30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 62 74 61   );..    /* Obta
27a40 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
27a50 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
27a60 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  se file. If the 
27a70 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72  exFlag parameter
27a80 0a 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c  .    ** is true,
27a90 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c   then immediatel
27aa0 79 20 75 70 67 72 61 64 65 20 74 68 69 73 20 74  y upgrade this t
27ab0 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  o an EXCLUSIVE l
27ac0 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20  ock. The.    ** 
27ad0 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
27ae0 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65  lback can be use
27af0 64 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  d when upgrading
27b00 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56   to the EXCLUSIV
27b10 45 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62  E.    ** lock, b
27b20 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61  ut not when obta
27b30 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52 56  ining the RESERV
27b40 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a  ED lock..    */.
27b50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
27b60 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
27b70 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  d, RESERVED_LOCK
27b80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
27b90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27ba0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
27bb0 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  = PAGER_RESERVED
27bc0 3b 0a 20 20 20 20 20 20 69 66 28 20 65 78 46 6c  ;.      if( exFl
27bd0 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ag ){.        rc
27be0 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
27bf0 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
27c00 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
27c10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
27c20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75    /* If the requ
27c30 69 72 65 64 20 6c 6f 63 6b 73 20 77 65 72 65 20  ired locks were 
27c40 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74  successfully obt
27c50 61 69 6e 65 64 2c 20 6f 70 65 6e 20 74 68 65 20  ained, open the 
27c60 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
27c70 69 6c 65 20 61 6e 64 20 77 72 69 74 65 20 74 68  ile and write th
27c80 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d  e first journal-
27c90 68 65 61 64 65 72 20 74 6f 20 69 74 2e 0a 20 20  header to it..  
27ca0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
27cb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
27cc0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
27cd0 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d  .     && pPager-
27ce0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
27cf0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
27d00 4f 46 46 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  OFF .    ){.    
27d10 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
27d20 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
27d30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
27d40 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
27d50 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67  er->jfd) && pPag
27d60 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
27d70 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  0 ){.    /* This
27d80 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74 68   happens when th
27d90 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65  e pager was in e
27da0 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
27db0 6d 6f 64 65 20 74 68 65 20 6c 61 73 74 0a 20 20  mode the last.  
27dc0 20 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61    ** time a (rea
27dd0 64 20 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e  d or write) tran
27de0 73 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63  saction was succ
27df0 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64  essfully conclud
27e00 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69  ed.    ** by thi
27e10 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e  s connection. In
27e20 73 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e  stead of deletin
27e30 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
27e40 6c 65 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a  le it was .    *
27e50 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20  * kept open and 
27e60 65 69 74 68 65 72 20 77 61 73 20 74 72 75 6e 63  either was trunc
27e70 61 74 65 64 20 74 6f 20 30 20 62 79 74 65 73 20  ated to 0 bytes 
27e80 6f 72 20 69 74 73 20 68 65 61 64 65 72 20 77 61  or its header wa
27e90 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 77 72 69  s.    ** overwri
27ea0 74 74 65 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e  tten with zeros.
27eb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
27ec0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  rt( pPager->nRec
27ed0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
27ee0 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  t( pPager->dbOri
27ef0 67 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20  gSize==0 );.    
27f00 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
27f10 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
27f20 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
27f30 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61  open_journal(pPa
27f40 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47  ger);.  }..  PAG
27f50 45 52 54 52 41 43 45 28 28 22 54 52 41 4e 53 41  ERTRACE(("TRANSA
27f60 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47  CTION %d\n", PAG
27f70 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
27f80 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
27f90 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
27fa0 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
27fb0 6c 4f 66 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51  lOff>0 || rc!=SQ
27fc0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
27fd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27fe0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
27ff0 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
28000 64 20 29 3b 0a 20 20 20 20 2f 2a 20 49 67 6e 6f  d );.    /* Igno
28010 72 65 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20  re any IO error 
28020 74 68 61 74 20 6f 63 63 75 72 73 20 77 69 74 68  that occurs with
28030 69 6e 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61  in pager_end_tra
28040 6e 73 61 63 74 69 6f 6e 28 29 2e 20 54 68 65 0a  nsaction(). The.
28050 20 20 20 20 2a 2a 20 70 75 72 70 6f 73 65 20 6f      ** purpose o
28060 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 74  f this call is t
28070 6f 20 72 65 73 65 74 20 74 68 65 20 69 6e 74 65  o reset the inte
28080 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68  rnal state of th
28090 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 73  e pager.    ** s
280a0 75 62 2d 73 79 73 74 65 6d 2e 20 49 74 20 64 6f  ub-system. It do
280b0 65 73 6e 27 74 20 6d 61 74 74 65 72 20 69 66 20  esn't matter if 
280c0 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  the journal-file
280d0 20 69 73 20 6e 6f 74 20 70 72 6f 70 65 72 6c 79   is not properly
280e0 0a 20 20 20 20 2a 2a 20 66 69 6e 61 6c 69 7a 65  .    ** finalize
280f0 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  d at this point 
28100 28 73 69 6e 63 65 20 69 74 20 69 73 20 6e 6f 74  (since it is not
28110 20 61 20 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c   a valid journal
28120 20 66 69 6c 65 20 61 6e 79 77 61 79 29 2e 0a 20   file anyway).. 
28130 20 20 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f     */.    pager_
28140 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
28150 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a  pPager, 0);.  }.
28160 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
28170 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e  /*.** Mark a sin
28180 67 6c 65 20 64 61 74 61 20 70 61 67 65 20 61 73  gle data page as
28190 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20   writeable. The 
281a0 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
281b0 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69  into the .** mai
281c0 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62  n journal or sub
281d0 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75  -journal as requ
281e0 69 72 65 64 2e 20 49 66 20 74 68 65 20 70 61 67  ired. If the pag
281f0 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
28200 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20  o.** one of the 
28210 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f  journals, the co
28220 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
28230 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a  is set in the .*
28240 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  * Pager.pInJourn
28250 61 6c 20 62 69 74 76 65 63 20 61 6e 64 20 74 68  al bitvec and th
28260 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
28270 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69  .pInSavepoint bi
28280 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20  tvecs.** of any 
28290 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
282a0 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  as appropriate..
282b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
282c0 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20  ger_write(PgHdr 
282d0 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70  *pPg){.  void *p
282e0 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
282f0 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  a;.  Pager *pPag
28300 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
28310 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
28320 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68  ITE_OK;..  /* Ch
28330 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a 20  eck for errors. 
28340 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
28350 2d 3e 65 72 72 43 6f 64 65 20 29 7b 20 0a 20 20  ->errCode ){ .  
28360 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
28370 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20  >errCode;.  }.  
28380 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64  if( pPager->read
28390 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75  Only ){.    retu
283a0 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
283b0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 21    }..  assert( !
283c0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
283d0 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41  r );..  CHECK_PA
283e0 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d  GE(pPg);..  /* M
283f0 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
28400 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70  dirty.  If the p
28410 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  age has already 
28420 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a  been written.  *
28430 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * to the journal
28440 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74   then we can ret
28450 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a  urn right away..
28460 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63    */.  sqlite3Pc
28470 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
28480 67 29 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e  g);.  if( pageIn
28490 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20  Journal(pPg) && 
284a0 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67  !subjRequiresPag
284b0 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 70 50  e(pPg) ){.    pP
284c0 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
284d0 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a   = 1;.  }else{..
284e0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74      /* If we get
284f0 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
28500 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
28510 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  e needs to be.  
28520 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20    ** written to 
28530 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
28540 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63  journal or the c
28550 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  keckpoint journa
28560 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68  l.    ** or both
28570 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
28580 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73  First check to s
28590 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e  ee that the tran
285a0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
285b0 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a  exists and.    *
285c0 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20 69  * create it if i
285d0 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20  t does not..    
285e0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
285f0 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
28600 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
28610 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
28620 67 65 72 42 65 67 69 6e 28 70 50 61 67 65 72 2c  gerBegin(pPager,
28630 20 30 2c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a   0, pPager->subj
28640 49 6e 4d 65 6d 6f 72 79 29 3b 0a 20 20 20 20 69  InMemory);.    i
28650 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28660 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
28670 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   rc;.    }.    a
28680 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
28690 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
286a0 52 56 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  RVED );.    if( 
286b0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
286c0 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e  jfd) && pPager->
286d0 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  useJournal.     
286e0 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
286f0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
28700 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
28710 46 46 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  FF ){.      rc =
28720 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
28730 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
28740 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28750 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
28760 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
28770 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d  er->dbModified =
28780 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68   1;.  .    /* Th
28790 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
287a0 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73  urnal now exists
287b0 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52   and we have a R
287c0 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20  ESERVED or an.  
287d0 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
287e0 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ock on the main 
287f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
28800 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  Write the curren
28810 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a  t page to.    **
28820 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
28830 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69   journal if it i
28840 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
28850 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
28860 69 66 28 20 21 70 61 67 65 49 6e 4a 6f 75 72 6e  if( !pageInJourn
28870 61 6c 28 70 50 67 29 20 26 26 20 69 73 4f 70 65  al(pPg) && isOpe
28880 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
28890 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d  {.      if( pPg-
288a0 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64  >pgno<=pPager->d
288b0 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20  bOrigSize ){.   
288c0 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a       u32 cksum;.
288d0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44          char *pD
288e0 61 74 61 32 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ata2;..        /
288f0 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  * We should neve
28900 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  r write to the j
28910 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20  ournal file the 
28920 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20  page that.      
28930 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
28940 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73  e database locks
28950 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
28960 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73   assert verifies
28970 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
28980 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20   we do not. */. 
28990 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
289a0 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f  Pg->pgno!=PAGER_
289b0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
289c0 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43  );.        CODEC
289d0 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
289e0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72   pPg->pgno, 7, r
289f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
28a00 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20  EM, pData2);.   
28a10 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67       cksum = pag
28a20 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
28a30 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20   (u8*)pData2);. 
28a40 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
28a50 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
28a60 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
28a70 72 6e 61 6c 4f 66 66 2c 20 70 50 67 2d 3e 70 67  rnalOff, pPg->pg
28a80 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
28a90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28aa0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
28ab0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
28ac0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61  pPager->jfd, pDa
28ad0 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
28ae0 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
28af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b00 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
28b10 72 6e 61 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20  rnalOff + 4);.  
28b20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
28b30 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50  journalOff += pP
28b40 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34  ager->pageSize+4
28b50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28b60 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28b70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
28b80 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
28b90 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
28ba0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
28bb0 4f 66 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20  Off, cksum);.   
28bc0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
28bd0 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a  ournalOff += 4;.
28be0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28bf0 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54    IOTRACE(("JOUT
28c00 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e   %p %d %lld %d\n
28c10 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
28c20 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20  pgno, .         
28c30 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
28c40 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67  journalOff, pPag
28c50 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a  er->pageSize));.
28c60 20 20 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e          PAGER_IN
28c70 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
28c80 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a  _writej_count);.
28c90 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
28ca0 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20  CE(("JOURNAL %d 
28cb0 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
28cc0 3d 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e  =%d hash(%08x)\n
28cd0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
28ce0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
28cf0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20   pPg->pgno, .   
28d00 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d            ((pPg-
28d10 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
28d20 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61  D_SYNC)?1:0), pa
28d30 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
28d40 29 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  )));..        /*
28d50 20 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f   Even if an IO o
28d60 72 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72  r diskfull error
28d70 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
28d80 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a  journalling the.
28d90 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
28da0 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f  in the block abo
28db0 76 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64  ve, set the need
28dc0 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74  -sync flag for t
28dd0 68 65 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20  he page..       
28de0 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77   ** Otherwise, w
28df0 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
28e00 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
28e10 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e  ck, the logic in
28e20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6c 61 79  .        ** play
28e30 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20  back_one_page() 
28e40 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20  will think that 
28e50 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
28e60 6f 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20  o be restored.  
28e70 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
28e80 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
28e90 6e 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f  nd if an IO erro
28ea0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64  r occurs while d
28eb0 6f 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20 20  oing so,.       
28ec0 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74   ** then corrupt
28ed0 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a  ion may follow..
28ee0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
28ef0 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
28f00 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
28f10 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
28f20 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
28f30 43 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  C;.          pPa
28f40 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
28f50 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  1;.        }..  
28f60 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f        /* An erro
28f70 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 77  r has occurred w
28f80 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
28f90 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
28fa0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  .        ** tran
28fb0 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
28fc0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74  rolled back by t
28fd0 68 65 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a  he layer above..
28fe0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
28ff0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29000 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
29010 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
29020 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
29030 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a  pPager->nRec++;.
29040 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
29050 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
29060 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  al!=0 );.       
29070 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74   rc = sqlite3Bit
29080 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
29090 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
290a0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74  pgno);.        t
290b0 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
290c0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
290d0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
290e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
290f0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
29100 3b 0a 20 20 20 20 20 20 20 20 72 63 20 7c 3d 20  ;.        rc |= 
29110 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
29120 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50  tvecs(pPager, pP
29130 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
29140 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29150 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
29160 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
29170 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
29180 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
29190 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
291a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
291b0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
291c0 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20  urnalStarted && 
291d0 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
291e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67  ){.          pPg
291f0 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
29200 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20  _NEED_SYNC;.    
29210 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65        pPager->ne
29220 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
29230 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41      }.        PA
29240 47 45 52 54 52 41 43 45 28 28 22 41 50 50 45 4e  GERTRACE(("APPEN
29250 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  D %d page %d nee
29260 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20  dSync=%d\n",.   
29270 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
29280 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
29290 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20  g->pgno,.       
292a0 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66          ((pPg->f
292b0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
292c0 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20  SYNC)?1:0)));.  
292d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
292e0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61     /* If the sta
292f0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
29300 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70  s open and the p
29310 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74  age is not in it
29320 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72  ,.    ** then wr
29330 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
29340 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74  page to the stat
29350 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  ement journal.  
29360 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  Note that.    **
29370 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
29380 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69  ournal format di
29390 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73  ffers from the s
293a0 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20  tandard journal 
293b0 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e  format.    ** in
293c0 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74   that it omits t
293d0 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64  he checksums and
293e0 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20   the header..   
293f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a   */.    if( subj
29400 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
29410 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
29420 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70  subjournalPage(p
29430 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
29440 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
29450 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e  database size an
29460 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20  d return..  */. 
29470 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
29480 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
29490 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50  ARED );.  if( pP
294a0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67  ager->dbSize<pPg
294b0 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
294c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
294d0 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20  Pg->pgno;.  }.  
294e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
294f0 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20  .** Mark a data 
29500 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
29510 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  e. This routine 
29520 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62  must be called b
29530 65 66 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67  efore .** making
29540 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61   changes to a pa
29550 67 65 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  ge. The caller m
29560 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65  ust check the re
29570 74 75 72 6e 20 76 61 6c 75 65 20 0a 2a 2a 20 6f  turn value .** o
29580 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
29590 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e  and be careful n
295a0 6f 74 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 79  ot to change any
295b0 20 70 61 67 65 20 64 61 74 61 20 75 6e 6c 65 73   page data unles
295c0 73 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  s .** this routi
295d0 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
295e0 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  E_OK..**.** The 
295f0 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
29600 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
29610 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65   and pager_write
29620 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a  () is that this.
29630 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f  ** function also
29640 20 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20   deals with the 
29650 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65  special case whe
29660 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67  re 2 or more pag
29670 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73  es.** fit on a s
29680 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
29690 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  r. In this case 
296a0 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20  all co-resident 
296b0 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61  pages.** must ha
296c0 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
296d0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
296e0 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ile before retur
296f0 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ning..**.** If a
29700 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
29710 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20  SQLITE_NOMEM or 
29720 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
29730 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
29740 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20  as appropriate. 
29750 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
29760 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
29770 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44  ite3PagerWrite(D
29780 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b  bPage *pDbPage){
29790 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
297a0 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20  TE_OK;..  PgHdr 
297b0 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a  *pPg = pDbPage;.
297c0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
297d0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
297e0 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65   Pgno nPagePerSe
297f0 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e  ctor = (pPager->
29800 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65  sectorSize/pPage
29810 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
29820 20 69 66 28 20 6e 50 61 67 65 50 65 72 53 65 63   if( nPagePerSec
29830 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e  tor>1 ){.    Pgn
29840 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20  o nPageCount;   
29850 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
29860 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
29870 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
29880 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31   */.    Pgno pg1
29890 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
298a0 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
298b0 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
298c0 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
298d0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67   */.    int nPag
298e0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
298f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
29900 61 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74  ages starting at
29910 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20   pg1 to journal 
29920 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20  */.    int ii;  
29930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29940 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
29950 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64   */.    int need
29960 53 79 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20  Sync = 0;       
29970 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79    /* True if any
29980 20 70 61 67 65 20 68 61 73 20 50 47 48 44 52 5f   page has PGHDR_
29990 4e 45 45 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20  NEED_SYNC */..  
299a0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e    /* Set the doN
299b0 6f 74 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31  otSync flag to 1
299c0 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
299d0 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f  e we cannot allo
299e0 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  w a journal.    
299f0 2a 2a 20 68 65 61 64 65 72 20 74 6f 20 62 65 20  ** header to be 
29a00 77 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20  written between 
29a10 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61  the pages journa
29a20 6c 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  led by this func
29a30 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
29a40 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
29a50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
29a60 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
29a70 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==0 );.    pPage
29a80 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31  r->doNotSync = 1
29a90 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74  ;..    /* This t
29aa0 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61  rick assumes tha
29ab0 74 20 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d  t both the page-
29ac0 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
29ad0 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  size are.    ** 
29ae0 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72  an integer power
29af0 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20 76   of 2. It sets v
29b00 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74  ariable pg1 to t
29b10 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20  he identifier.  
29b20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73    ** of the firs
29b30 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
29b40 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
29b50 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ted on..    */. 
29b60 20 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e     pg1 = ((pPg->
29b70 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67  pgno-1) & ~(nPag
29b80 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b  ePerSector-1)) +
29b90 20 31 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33   1;..    sqlite3
29ba0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
29bb0 50 61 67 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e  Pager, (int *)&n
29bc0 50 61 67 65 43 6f 75 6e 74 29 3b 0a 20 20 20 20  PageCount);.    
29bd0 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50  if( pPg->pgno>nP
29be0 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  ageCount ){.    
29bf0 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e    nPage = (pPg->
29c00 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20  pgno - pg1)+1;. 
29c10 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67     }else if( (pg
29c20 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  1+nPagePerSector
29c30 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29  -1)>nPageCount )
29c40 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
29c50 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31  nPageCount+1-pg1
29c60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
29c70 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
29c80 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d  PerSector;.    }
29c90 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50 61 67  .    assert(nPag
29ca0 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e>0);.    assert
29cb0 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29  (pg1<=pPg->pgno)
29cc0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28 70 67  ;.    assert((pg
29cd0 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67  1+nPage)>pPg->pg
29ce0 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69  no);..    for(ii
29cf0 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20  =0; ii<nPage && 
29d00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
29d10 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  i++){.      Pgno
29d20 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20   pg = pg1+ii;.  
29d30 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
29d40 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67 3d 3d  ;.      if( pg==
29d50 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71  pPg->pgno || !sq
29d60 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
29d70 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
29d80 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20 20 20  al, pg) ){.     
29d90 20 20 20 69 66 28 20 70 67 21 3d 50 41 47 45 52     if( pg!=PAGER
29da0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
29db0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
29dc0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
29dd0 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26  et(pPager, pg, &
29de0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
29df0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
29e00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
29e10 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
29e20 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ite(pPage);.    
29e30 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
29e40 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  e->flags&PGHDR_N
29e50 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20  EED_SYNC ){.    
29e60 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79            needSy
29e70 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
29e80 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
29e90 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a  ger->needSync);.
29ea0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
29eb0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
29ec0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
29ed0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
29ee0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29ef0 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61 67 65  }else if( (pPage
29f00 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
29f10 70 50 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20  pPager, pg))!=0 
29f20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
29f30 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44  Page->flags&PGHD
29f40 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20  R_NEED_SYNC ){. 
29f50 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
29f60 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
29f70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
29f80 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
29f90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
29fa0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
29fb0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
29fc0 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20  flag is set for 
29fd0 61 6e 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65  any of the nPage
29fe0 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73   pages .    ** s
29ff0 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20  tarting at pg1, 
2a000 74 68 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f  then it needs to
2a010 20 62 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20   be set for all 
2a020 6f 66 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65  of them. Because
2a030 0a 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20  .    ** writing 
2a040 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20  to any of these 
2a050 6e 50 61 67 65 20 70 61 67 65 73 20 6d 61 79 20  nPage pages may 
2a060 64 61 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72  damage the other
2a070 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  s, the.    ** jo
2a080 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
2a090 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64  contain sync()ed
2a0a0 20 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f   copies of all o
2a0b0 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65  f them.    ** be
2a0c0 66 6f 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d  fore any of them
2a0d0 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
2a0e0 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
2a0f0 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
2a100 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2a110 49 54 45 5f 4f 4b 20 26 26 20 6e 65 65 64 53 79  ITE_OK && needSy
2a120 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  nc ){.      asse
2a130 72 74 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50  rt( !MEMDB && pP
2a140 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20  ager->noSync==0 
2a150 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  );.      for(ii=
2a160 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 6e  0; ii<nPage && n
2a170 65 65 64 53 79 6e 63 3b 20 69 69 2b 2b 29 7b 0a  eedSync; ii++){.
2a180 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70          PgHdr *p
2a190 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  Page = pager_loo
2a1a0 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 31 2b  kup(pPager, pg1+
2a1b0 69 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ii);.        if(
2a1c0 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20   pPage ){.      
2a1d0 20 20 20 20 70 50 61 67 65 2d 3e 66 6c 61 67 73      pPage->flags
2a1e0 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53   |= PGHDR_NEED_S
2a1f0 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73  YNC;.          s
2a200 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
2a210 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
2a220 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2a230 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
2a240 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d  needSync);.    }
2a250 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ..    assert( pP
2a260 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d  ager->doNotSync=
2a270 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =1 );.    pPager
2a280 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b  ->doNotSync = 0;
2a290 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
2a2a0 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70   = pager_write(p
2a2b0 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  DbPage);.  }.  r
2a2c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2a2d0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
2a2e0 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  f the page given
2a2f0 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
2a300 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
2a310 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c  passed.** to sql
2a320 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
2a330 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
2a340 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69  s, return TRUE i
2a350 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f  f it is ok.** to
2a360 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74   change the cont
2a370 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
2a380 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
2a390 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  UG.int sqlite3Pa
2a3a0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 44  gerIswriteable(D
2a3b0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
2a3c0 65 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73  eturn pPg->flags
2a3d0 26 50 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a  &PGHDR_DIRTY;.}.
2a3e0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20  #endif../*.** A 
2a3f0 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
2a400 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70  tine tells the p
2a410 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20  ager that it is 
2a420 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
2a430 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e  .** write the in
2a440 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67  formation on pag
2a450 65 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68  e pPg back to th
2a460 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f  e disk, even tho
2a470 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65  ugh.** that page
2a480 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64   might be marked
2a490 20 61 73 20 64 69 72 74 79 2e 20 20 54 68 69 73   as dirty.  This
2a4a0 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78   happens, for ex
2a4b0 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74  ample, when.** t
2a4c0 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  he page has been
2a4d0 20 61 64 64 65 64 20 61 73 20 61 20 6c 65 61 66   added as a leaf
2a4e0 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
2a4f0 20 61 6e 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63   and so its.** c
2a500 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72  ontent no longer
2a510 20 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20   matters..**.** 
2a520 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f  The overlying so
2a530 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c  ftware layer cal
2a540 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
2a550 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  when all of the 
2a560 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67  data.** on the g
2a570 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75  iven page is unu
2a580 73 65 64 2e 20 54 68 65 20 70 61 67 65 72 20 6d  sed. The pager m
2a590 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73  arks the page as
2a5a0 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61   clean so.** tha
2a5b0 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65  t it does not ge
2a5c0 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  t written to dis
2a5d0 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73  k..**.** Tests s
2a5e0 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70  how that this op
2a5f0 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 71  timization can q
2a600 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65  uadruple the spe
2a610 65 64 20 6f 66 20 6c 61 72 67 65 20 0a 2a 2a 20  ed of large .** 
2a620 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e  DELETE operation
2a630 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
2a640 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
2a650 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
2a660 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2a670 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
2a680 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  f( (pPg->flags&P
2a690 47 48 44 52 5f 44 49 52 54 59 29 20 26 26 20 70  GHDR_DIRTY) && p
2a6a0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
2a6b0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 50 41 47 45  t==0 ){.    PAGE
2a6c0 52 54 52 41 43 45 28 28 22 44 4f 4e 54 5f 57 52  RTRACE(("DONT_WR
2a6d0 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25  ITE page %d of %
2a6e0 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
2a6f0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2a700 29 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  ));.    IOTRACE(
2a710 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22  ("CLEAN %p %d\n"
2a720 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
2a730 67 6e 6f 29 29 0a 20 20 20 20 70 50 67 2d 3e 66  gno)).    pPg->f
2a740 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f  lags |= PGHDR_DO
2a750 4e 54 5f 57 52 49 54 45 3b 0a 23 69 66 64 65 66  NT_WRITE;.#ifdef
2a760 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
2a770 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
2a780 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
2a790 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
2a7a0 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  dif.  }.}../*.**
2a7b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2a7c0 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65   called to incre
2a7d0 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f  ment the value o
2a7e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2a7f0 69 6c 65 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63  ile .** change-c
2a800 6f 75 6e 74 65 72 2c 20 73 74 6f 72 65 64 20 61  ounter, stored a
2a810 73 20 61 20 34 2d 62 79 74 65 20 62 69 67 2d 65  s a 4-byte big-e
2a820 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 73 74  ndian integer st
2a830 61 72 74 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79  arting at .** by
2a840 74 65 20 6f 66 66 73 65 74 20 32 34 20 6f 66 20  te offset 24 of 
2a850 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
2a860 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 73 44  **.** If the isD
2a870 69 72 65 63 74 20 66 6c 61 67 20 69 73 20 7a 65  irect flag is ze
2a880 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  ro, then this is
2a890 20 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67   done by calling
2a8a0 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65   .** sqlite3Page
2a8b0 72 57 72 69 74 65 28 29 20 6f 6e 20 70 61 67 65  rWrite() on page
2a8c0 20 31 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 69   1, then modifyi
2a8d0 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
2a8e0 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 64  of the.** page d
2a8f0 61 74 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ata. In this cas
2a900 65 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20  e the file will 
2a910 62 65 20 75 70 64 61 74 65 64 20 77 68 65 6e 20  be updated when 
2a920 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74  the current.** t
2a930 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
2a940 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  mmitted..**.** T
2a950 68 65 20 69 73 44 69 72 65 63 74 20 66 6c 61 67  he isDirect flag
2a960 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e   may only be non
2a970 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 6c 69 62  -zero if the lib
2a980 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65  rary was compile
2a990 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 53 51  d.** with the SQ
2a9a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
2a9b0 49 43 5f 57 52 49 54 45 20 6d 61 63 72 6f 20 64  IC_WRITE macro d
2a9c0 65 66 69 6e 65 64 2e 20 49 6e 20 74 68 69 73 20  efined. In this 
2a9d0 63 61 73 65 2c 0a 2a 2a 20 69 66 20 69 73 44 69  case,.** if isDi
2a9e0 72 65 63 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  rect is non-zero
2a9f0 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62  , then the datab
2aa00 61 73 65 20 66 69 6c 65 20 69 73 20 75 70 64 61  ase file is upda
2aa10 74 65 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20  ted directly.** 
2aa20 62 79 20 77 72 69 74 69 6e 67 20 61 6e 20 75 70  by writing an up
2aa30 64 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  dated version of
2aa40 20 70 61 67 65 20 31 20 75 73 69 6e 67 20 61 20   page 1 using a 
2aa50 63 61 6c 6c 20 74 6f 20 74 68 65 20 0a 2a 2a 20  call to the .** 
2aa60 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29  sqlite3OsWrite()
2aa70 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
2aa80 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69  atic int pager_i
2aa90 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
2aaa0 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
2aab0 20 69 6e 74 20 69 73 44 69 72 65 63 74 4d 6f 64   int isDirectMod
2aac0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
2aad0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
2aae0 44 65 63 6c 61 72 65 20 61 6e 64 20 69 6e 69 74  Declare and init
2aaf0 69 61 6c 69 7a 65 20 63 6f 6e 73 74 61 6e 74 20  ialize constant 
2ab00 69 6e 74 65 67 65 72 20 27 69 73 44 69 72 65 63  integer 'isDirec
2ab10 74 27 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  t'. If the.  ** 
2ab20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
2ab30 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e 61  imization is ena
2ab40 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75 69  bled in this bui
2ab50 6c 64 2c 20 74 68 65 6e 20 69 73 44 69 72 65 63  ld, then isDirec
2ab60 74 0a 20 20 2a 2a 20 69 73 20 69 6e 69 74 69 61  t.  ** is initia
2ab70 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c  lized to the val
2ab80 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
2ab90 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 70 61   isDirectMode pa
2aba0 72 61 6d 65 74 65 72 0a 20 20 2a 2a 20 74 6f 20  rameter.  ** to 
2abb0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f  this function. O
2abc0 74 68 65 72 77 69 73 65 2c 20 69 74 20 69 73 20  therwise, it is 
2abd0 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 7a 65  always set to ze
2abe0 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ro..  **.  ** Th
2abf0 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20 69  e idea is that i
2ac00 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  f the atomic-wri
2ac10 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
2ac20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61 62  is not.  ** enab
2ac30 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  led at compile t
2ac40 69 6d 65 2c 20 74 68 65 20 63 6f 6d 70 69 6c 65  ime, the compile
2ac50 72 20 63 61 6e 20 6f 6d 69 74 20 74 68 65 20 74  r can omit the t
2ac60 65 73 74 73 20 6f 66 0a 20 20 2a 2a 20 27 69 73  ests of.  ** 'is
2ac70 44 69 72 65 63 74 27 20 62 65 6c 6f 77 2c 20 61  Direct' below, a
2ac80 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6c  s well as the bl
2ac90 6f 63 6b 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20  ock enclosed in 
2aca0 74 68 65 0a 20 20 2a 2a 20 22 69 66 28 20 69 73  the.  ** "if( is
2acb0 44 69 72 65 63 74 20 29 22 20 63 6f 6e 64 69 74  Direct )" condit
2acc0 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  ion..  */.#ifnde
2acd0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2ace0 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 63  ATOMIC_WRITE.  c
2acf0 6f 6e 73 74 20 69 6e 74 20 69 73 44 69 72 65 63  onst int isDirec
2ad00 74 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  t = 0;.  assert(
2ad10 20 69 73 44 69 72 65 63 74 4d 6f 64 65 3d 3d 30   isDirectMode==0
2ad20 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
2ad30 41 4d 45 54 45 52 28 69 73 44 69 72 65 63 74 4d  AMETER(isDirectM
2ad40 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 20 20 63 6f  ode);.#else.  co
2ad50 6e 73 74 20 69 6e 74 20 69 73 44 69 72 65 63 74  nst int isDirect
2ad60 20 3d 20 69 73 44 69 72 65 63 74 4d 6f 64 65 3b   = isDirectMode;
2ad70 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
2ad80 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
2ad90 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
2ada0 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
2adb0 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
2adc0 6e 65 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62  ne && pPager->db
2add0 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 50 67  Size>0 ){.    Pg
2ade0 48 64 72 20 2a 70 50 67 48 64 72 3b 20 20 20 20  Hdr *pPgHdr;    
2adf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2ae00 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
2ae10 20 31 20 2a 2f 0a 20 20 20 20 75 33 32 20 63 68   1 */.    u32 ch
2ae20 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 20 20 20  ange_counter;   
2ae30 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
2ae40 61 6c 20 76 61 6c 75 65 20 6f 66 20 63 68 61 6e  al value of chan
2ae50 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
2ae60 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
2ae70 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
2ae80 6c 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  le && isOpen(pPa
2ae90 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 20  ger->fd) );..   
2aea0 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20   /* Open page 1 
2aeb0 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20  of the file for 
2aec0 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  writing. */.    
2aed0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2aee0 72 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20  rGet(pPager, 1, 
2aef0 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 61 73  &pPgHdr);.    as
2af00 73 65 72 74 28 20 70 50 67 48 64 72 3d 3d 30 20  sert( pPgHdr==0 
2af10 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
2af20 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70   );..    /* If p
2af30 61 67 65 20 6f 6e 65 20 77 61 73 20 66 65 74 63  age one was fetc
2af40 68 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  hed successfully
2af50 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  , and this funct
2af60 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a  ion is not.    *
2af70 2a 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 64  * operating in d
2af80 69 72 65 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65  irect-mode, make
2af90 20 70 61 67 65 20 31 20 77 72 69 74 61 62 6c 65   page 1 writable
2afa0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2afb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2afc0 26 20 21 69 73 44 69 72 65 63 74 20 29 7b 0a 20  & !isDirect ){. 
2afd0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2afe0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 48  3PagerWrite(pPgH
2aff0 64 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  dr);.    }..    
2b000 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b010 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  K ){.      /* In
2b020 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
2b030 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20  e just read and 
2b040 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f  write it back to
2b050 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20   byte 24. */.   
2b060 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65     change_counte
2b070 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62  r = sqlite3Get4b
2b080 79 74 65 28 28 75 38 2a 29 70 50 61 67 65 72 2d  yte((u8*)pPager-
2b090 3e 64 62 46 69 6c 65 56 65 72 73 29 3b 0a 20 20  >dbFileVers);.  
2b0a0 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74      change_count
2b0b0 65 72 2b 2b 3b 0a 20 20 20 20 20 20 70 75 74 33  er++;.      put3
2b0c0 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50  2bits(((char*)pP
2b0d0 67 48 64 72 2d 3e 70 44 61 74 61 29 2b 32 34 2c  gHdr->pData)+24,
2b0e0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29   change_counter)
2b0f0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  ;..      /* If r
2b100 75 6e 6e 69 6e 67 20 69 6e 20 64 69 72 65 63 74  unning in direct
2b110 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 74 68 65   mode, write the
2b120 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67   contents of pag
2b130 65 20 31 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  e 1 to the file.
2b140 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
2b150 44 69 72 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Direct ){.      
2b160 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42    const void *zB
2b170 75 66 20 3d 20 70 50 67 48 64 72 2d 3e 70 44 61  uf = pPgHdr->pDa
2b180 74 61 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ta;.        asse
2b190 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 46 69  rt( pPager->dbFi
2b1a0 6c 65 53 69 7a 65 3e 30 20 29 3b 0a 20 20 20 20  leSize>0 );.    
2b1b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b1c0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
2b1d0 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72  fd, zBuf, pPager
2b1e0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a  ->pageSize, 0);.
2b1f0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
2b200 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
2b210 77 6f 72 6b 65 64 2c 20 73 65 74 20 74 68 65 20  worked, set the 
2b220 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
2b230 66 6c 61 67 2e 20 2a 2f 0a 20 20 20 20 20 20 69  flag. */.      i
2b240 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2b250 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
2b260 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
2b270 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  one = 1;.      }
2b280 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
2b290 65 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20  elease the page 
2b2a0 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20  reference. */.  
2b2b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
2b2c0 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d  ref(pPgHdr);.  }
2b2d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2b2e0 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
2b2f0 70 61 67 65 72 20 66 69 6c 65 20 74 6f 20 64 69  pager file to di
2b300 73 6b 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f  sk. This is a no
2b310 2d 6f 70 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72  -op for in-memor
2b320 79 20 66 69 6c 65 73 0a 2a 2a 20 6f 72 20 70 61  y files.** or pa
2b330 67 65 73 20 77 69 74 68 20 74 68 65 20 50 61 67  ges with the Pag
2b340 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 73  er.noSync flag s
2b350 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  et..**.** If suc
2b360 63 65 73 73 66 75 6c 2c 20 6f 72 20 63 61 6c 6c  cessful, or call
2b370 65 64 20 6f 6e 20 61 20 70 61 67 65 72 20 66 6f  ed on a pager fo
2b380 72 20 77 68 69 63 68 20 69 74 20 69 73 20 61 20  r which it is a 
2b390 6e 6f 2d 6f 70 2c 20 74 68 69 73 0a 2a 2a 20 66  no-op, this.** f
2b3a0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
2b3b0 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72  SQLITE_OK. Other
2b3c0 77 69 73 65 2c 20 61 6e 20 49 4f 20 65 72 72 6f  wise, an IO erro
2b3d0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
2b3e0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
2b3f0 65 33 50 61 67 65 72 53 79 6e 63 28 50 61 67 65  e3PagerSync(Page
2b400 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
2b410 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
2b420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b430 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2b440 65 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42  e */.  if( MEMDB
2b450 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79   || pPager->noSy
2b460 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  nc ){.    rc = S
2b470 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
2b480 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
2b490 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
2b4a0 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  ->fd, pPager->sy
2b4b0 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20  nc_flags);.  }. 
2b4c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2b4d0 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61  *.** Sync the da
2b4e0 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
2b4f0 74 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72  the pager pPager
2b500 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
2b510 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20   to the name.** 
2b520 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
2b530 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
2b540 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
2b550 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64  into the individ
2b560 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ual.** journal f
2b570 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79  ile. zMaster may
2b580 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20   be NULL, which 
2b590 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
2b5a0 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a  s no master.** j
2b5b0 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65  ournal (a single
2b5c0 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
2b5d0 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  ction)..**.** Th
2b5e0 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72  is routine ensur
2b5f0 65 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20  es that:.**.**  
2b600 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20   * The database 
2b610 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e  file change-coun
2b620 74 65 72 20 69 73 20 75 70 64 61 74 65 64 2c 0a  ter is updated,.
2b630 2a 2a 20 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e  **   * the journ
2b640 61 6c 20 69 73 20 73 79 6e 63 65 64 20 28 75 6e  al is synced (un
2b650 6c 65 73 73 20 74 68 65 20 61 74 6f 6d 69 63 2d  less the atomic-
2b660 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
2b670 6f 6e 20 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20  on is used),.** 
2b680 20 20 2a 20 61 6c 6c 20 64 69 72 74 79 20 70 61    * all dirty pa
2b690 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  ges are written 
2b6a0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2b6b0 66 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68  file, .**   * th
2b6c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2b6d0 69 73 20 74 72 75 6e 63 61 74 65 64 20 28 69 66  is truncated (if
2b6e0 20 72 65 71 75 69 72 65 64 29 2c 20 61 6e 64 0a   required), and.
2b6f0 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62  **   * the datab
2b700 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e  ase file synced.
2b710 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79   .**.** The only
2b720 20 74 68 69 6e 67 20 74 68 61 74 20 72 65 6d 61   thing that rema
2b730 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ins to commit th
2b740 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
2b750 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a   to finalize .**
2b760 20 28 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61   (delete, trunca
2b770 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 66  te or zero the f
2b780 69 72 73 74 20 70 61 72 74 20 6f 66 29 20 74 68  irst part of) th
2b790 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
2b7a0 6f 72 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68  or .** delete th
2b7b0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
2b7c0 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69   file if specifi
2b7d0 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ed)..**.** Note 
2b7e0 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d  that if zMaster=
2b7f0 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73  =NULL, this does
2b800 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61   not overwrite a
2b810 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a   previous value.
2b820 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20  ** passed to an 
2b830 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
2b840 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c  itPhaseOne() cal
2b850 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
2b860 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20  final parameter 
2b870 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74 72  - noSync - is tr
2b880 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ue, then the dat
2b890 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c  abase file itsel
2b8a0 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63  f.** is not sync
2b8b0 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  ed. The caller m
2b8c0 75 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  ust call sqlite3
2b8d0 50 61 67 65 72 53 79 6e 63 28 29 20 64 69 72 65  PagerSync() dire
2b8e0 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20  ctly to.** sync 
2b8f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2b900 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  e before calling
2b910 20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28   CommitPhaseTwo(
2b920 29 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a  ) to delete the.
2b930 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
2b940 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f  in this case..*/
2b950 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2b960 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
2b970 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2b980 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b990 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
2b9a0 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
2b9b0 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20  ar *zMaster,    
2b9c0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
2b9d0 74 20 4e 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74  t NULL, the mast
2b9e0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
2b9f0 2a 2f 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20  */.  int noSync 
2ba00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba10 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
2ba20 6f 6d 69 74 20 74 68 65 20 78 53 79 6e 63 20 6f  omit the xSync o
2ba30 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 2a 2f  n the db file */
2ba40 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
2ba50 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2ba60 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2ba70 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70  code */..  if( p
2ba80 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
2ba90 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  {.    return pPa
2baa0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
2bab0 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  }..  PAGERTRACE(
2bac0 28 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a  ("DATABASE SYNC:
2bad0 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72   File=%s zMaster
2bae0 3d 25 73 20 6e 53 69 7a 65 3d 25 64 5c 6e 22 2c  =%s nSize=%d\n",
2baf0 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e   .      pPager->
2bb00 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74  zFilename, zMast
2bb10 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  er, pPager->dbSi
2bb20 7a 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ze));..  /* If t
2bb30 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
2bb40 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61  ory db, or no pa
2bb50 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  ges have been wr
2bb60 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69  itten to, or thi
2bb70 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
2bb80 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
2bb90 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
2bba0 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
2bbb0 66 28 20 4d 45 4d 44 42 20 26 26 20 70 50 61 67  f( MEMDB && pPag
2bbc0 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29  er->dbModified )
2bbd0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61 63  {.    sqlite3Bac
2bbe0 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65  kupRestart(pPage
2bbf0 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 7d  r->pBackup);.  }
2bc00 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
2bc10 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59  >state!=PAGER_SY
2bc20 4e 43 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e  NCED && pPager->
2bc30 64 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a 0a 20  dbModified ){.. 
2bc40 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
2bc50 69 6e 67 20 62 6c 6f 63 6b 20 75 70 64 61 74 65  ing block update
2bc60 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  s the change-cou
2bc70 6e 74 65 72 2e 20 45 78 61 63 74 6c 79 20 68 6f  nter. Exactly ho
2bc80 77 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73  w it.    ** does
2bc90 20 74 68 69 73 20 64 65 70 65 6e 64 73 20 6f 6e   this depends on
2bca0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
2bcb0 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61 74  the atomic-updat
2bcc0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20  e optimization. 
2bcd0 20 20 20 2a 2a 20 77 61 73 20 65 6e 61 62 6c 65     ** was enable
2bce0 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  d at compile tim
2bcf0 65 2c 20 61 6e 64 20 69 66 20 74 68 69 73 20 74  e, and if this t
2bd00 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65 65 74 73  ransaction meets
2bd10 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 75 6e   the .    ** run
2bd20 74 69 6d 65 20 63 72 69 74 65 72 69 61 20 74 6f  time criteria to
2bd30 20 75 73 65 20 74 68 65 20 6f 70 65 72 61 74 69   use the operati
2bd40 6f 6e 3a 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  on: .    **.    
2bd50 2a 2a 20 20 20 20 2a 20 54 68 65 20 66 69 6c 65  **    * The file
2bd60 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73  -system supports
2bd70 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
2bd80 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72 0a 20  e property for. 
2bd90 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b     **      block
2bda0 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65 2d 73  s of size page-s
2bdb0 69 7a 65 2c 20 61 6e 64 20 0a 20 20 20 20 2a 2a  ize, and .    **
2bdc0 20 20 20 20 2a 20 54 68 69 73 20 63 6f 6d 6d 69      * This commi
2bdd0 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66  t is not part of
2bde0 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72   a multi-file tr
2bdf0 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20  ansaction, and. 
2be00 20 20 20 2a 2a 20 20 20 20 2a 20 45 78 61 63 74     **    * Exact
2be10 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20  ly one page has 
2be20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e  been modified an
2be30 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a  d store in the j
2be40 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
2be50 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
2be60 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77  e optimization w
2be70 61 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 61  as not enabled a
2be80 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20  t compile time, 
2be90 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  then the.    ** 
2bea0 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
2beb0 65 63 6f 75 6e 74 65 72 28 29 20 66 75 6e 63 74  ecounter() funct
2bec0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
2bed0 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
2bee0 67 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74 65  ge.    ** counte
2bef0 72 20 69 6e 20 27 69 6e 64 69 72 65 63 74 2d 6d  r in 'indirect-m
2bf00 6f 64 65 27 2e 20 49 66 20 74 68 65 20 6f 70 74  ode'. If the opt
2bf10 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f 6d  imization is com
2bf20 70 69 6c 65 64 20 69 6e 20 62 75 74 0a 20 20 20  piled in but.   
2bf30 20 2a 2a 20 69 73 20 6e 6f 74 20 61 70 70 6c 69   ** is not appli
2bf40 63 61 62 6c 65 20 74 6f 20 74 68 69 73 20 74 72  cable to this tr
2bf50 61 6e 73 61 63 74 69 6f 6e 2c 20 63 61 6c 6c 20  ansaction, call 
2bf60 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72  sqlite3JournalCr
2bf70 65 61 74 65 28 29 0a 20 20 20 20 2a 2a 20 74 6f  eate().    ** to
2bf80 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6a   make sure the j
2bf90 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
2bfa0 61 63 74 75 61 6c 6c 79 20 62 65 65 6e 20 63 72  actually been cr
2bfb0 65 61 74 65 64 2c 20 74 68 65 6e 20 63 61 6c 6c  eated, then call
2bfc0 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e  .    ** pager_in
2bfd0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
2bfe0 28 29 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  () to update the
2bff0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
2c000 69 6e 20 69 6e 64 69 72 65 63 74 0a 20 20 20 20  in indirect.    
2c010 2a 2a 20 6d 6f 64 65 2e 20 0a 20 20 20 20 2a 2a  ** mode. .    **
2c020 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  .    ** Otherwis
2c030 65 2c 20 69 66 20 74 68 65 20 6f 70 74 69 6d 69  e, if the optimi
2c040 7a 61 74 69 6f 6e 20 69 73 20 62 6f 74 68 20 65  zation is both e
2c050 6e 61 62 6c 65 64 20 61 6e 64 20 61 70 70 6c 69  nabled and appli
2c060 63 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 74 68  cable,.    ** th
2c070 65 6e 20 63 61 6c 6c 20 70 61 67 65 72 5f 69 6e  en call pager_in
2c080 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
2c090 28 29 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  () to update the
2c0a0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 0a   change-counter.
2c0b0 20 20 20 20 2a 2a 20 69 6e 20 27 64 69 72 65 63      ** in 'direc
2c0c0 74 27 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69 73  t' mode. In this
2c0d0 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61   case the journa
2c0e0 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65  l file will neve
2c0f0 72 20 62 65 0a 20 20 20 20 2a 2a 20 63 72 65 61  r be.    ** crea
2c100 74 65 64 20 66 6f 72 20 74 68 69 73 20 74 72 61  ted for this tra
2c110 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  nsaction..    */
2c120 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
2c130 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
2c140 54 45 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  TE.    PgHdr *pP
2c150 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  g;.    assert( i
2c160 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2c170 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  d) || pPager->jo
2c180 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
2c190 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
2c1a0 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61   );.    if( !zMa
2c1b0 73 74 65 72 20 26 26 20 69 73 4f 70 65 6e 28 70  ster && isOpen(p
2c1c0 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20  Pager->jfd) .   
2c1d0 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
2c1e0 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66  rnalOff==jrnlBuf
2c1f0 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 20  ferSize(pPager) 
2c200 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d  .     && pPager-
2c210 3e 64 62 53 69 7a 65 3e 3d 70 50 61 67 65 72 2d  >dbSize>=pPager-
2c220 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20 20 20  >dbFileSize.    
2c230 20 26 26 20 28 30 3d 3d 28 70 50 67 20 3d 20 73   && (0==(pPg = s
2c240 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
2c250 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
2c260 43 61 63 68 65 29 29 20 7c 7c 20 30 3d 3d 70 50  Cache)) || 0==pP
2c270 67 2d 3e 70 44 69 72 74 79 29 0a 20 20 20 20 29  g->pDirty).    )
2c280 7b 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74  {.      /* Updat
2c290 65 20 74 68 65 20 64 62 20 66 69 6c 65 20 63 68  e the db file ch
2c2a0 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 76 69 61  ange counter via
2c2b0 20 74 68 65 20 64 69 72 65 63 74 2d 77 72 69 74   the direct-writ
2c2c0 65 20 6d 65 74 68 6f 64 2e 20 54 68 65 20 0a 20  e method. The . 
2c2d0 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e       ** followin
2c2e0 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69  g call will modi
2c2f0 66 79 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  fy the in-memory
2c300 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
2c310 6f 66 20 70 61 67 65 20 31 20 0a 20 20 20 20 20  of page 1 .     
2c320 20 2a 2a 20 74 6f 20 69 6e 63 6c 75 64 65 20 74   ** to include t
2c330 68 65 20 75 70 64 61 74 65 64 20 63 68 61 6e 67  he updated chang
2c340 65 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68  e counter and th
2c350 65 6e 20 77 72 69 74 65 20 70 61 67 65 20 31 20  en write page 1 
2c360 0a 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74  .      ** direct
2c370 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ly to the databa
2c380 73 65 20 66 69 6c 65 2e 20 42 65 63 61 75 73 65  se file. Because
2c390 20 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77   of the atomic-w
2c3a0 72 69 74 65 20 0a 20 20 20 20 20 20 2a 2a 20 70  rite .      ** p
2c3b0 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 68  roperty of the h
2c3c0 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  ost file-system,
2c3d0 20 74 68 69 73 20 69 73 20 73 61 66 65 2e 0a 20   this is safe.. 
2c3e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
2c3f0 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68   = pager_incr_ch
2c400 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67  angecounter(pPag
2c410 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73  er, 1);.    }els
2c420 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
2c430 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61  lite3JournalCrea
2c440 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  te(pPager->jfd);
2c450 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2c460 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c470 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69      rc = pager_i
2c480 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
2c490 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  r(pPager, 0);.  
2c4a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6c 73      }.    }.#els
2c4b0 65 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  e.    rc = pager
2c4c0 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
2c4d0 74 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ter(pPager, 0);.
2c4e0 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72  #endif.    if( r
2c4f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
2c500 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65  oto commit_phase
2c510 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20 20 20 20  _one_exit;..    
2c520 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e 73  /* If this trans
2c530 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20  action has made 
2c540 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6d 61  the database sma
2c550 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70  ller, then all p
2c560 61 67 65 73 0a 20 20 20 20 2a 2a 20 62 65 69 6e  ages.    ** bein
2c570 67 20 64 69 73 63 61 72 64 65 64 20 62 79 20 74  g discarded by t
2c580 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75  he truncation mu
2c590 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  st be written to
2c5a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
2c5b0 20 2a 2a 20 66 69 6c 65 2e 20 54 68 69 73 20 63   ** file. This c
2c5c0 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
2c5d0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
2c5e0 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  de..    **.    *
2c5f0 2a 20 42 65 66 6f 72 65 20 72 65 61 64 69 6e 67  * Before reading
2c600 20 74 68 65 20 70 61 67 65 73 20 77 69 74 68 20   the pages with 
2c610 70 61 67 65 20 6e 75 6d 62 65 72 73 20 6c 61 72  page numbers lar
2c620 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20  ger than the .  
2c630 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 76 61 6c    ** current val
2c640 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69  ue of Pager.dbSi
2c650 7a 65 2c 20 73 65 74 20 64 62 53 69 7a 65 20 62  ze, set dbSize b
2c660 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ack to the value
2c670 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 74 20  .    ** that it 
2c680 74 6f 6f 6b 20 61 74 20 74 68 65 20 73 74 61 72  took at the star
2c690 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
2c6a0 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c  tion. Otherwise,
2c6b0 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 6c 6c   the.    ** call
2c6c0 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  s to sqlite3Page
2c6d0 72 47 65 74 28 29 20 72 65 74 75 72 6e 20 7a 65  rGet() return ze
2c6e0 72 6f 65 64 20 70 61 67 65 73 20 69 6e 73 74 65  roed pages inste
2c6f0 61 64 20 6f 66 20 0a 20 20 20 20 2a 2a 20 72 65  ad of .    ** re
2c700 61 64 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 20  ading data from 
2c710 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2c720 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  e..    */.#ifnde
2c730 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2c740 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
2c750 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
2c760 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
2c770 7a 65 0a 20 20 20 20 20 26 26 20 70 50 61 67 65  ze.     && pPage
2c780 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
2c790 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2c7a0 45 5f 4f 46 46 20 0a 20 20 20 20 29 7b 0a 20 20  E_OFF .    ){.  
2c7b0 20 20 20 20 50 67 6e 6f 20 69 3b 20 20 20 20 20      Pgno i;     
2c7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c7e0 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
2c7f0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73  le */.      cons
2c800 74 20 50 67 6e 6f 20 69 53 6b 69 70 20 3d 20 50  t Pgno iSkip = P
2c810 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
2c820 67 65 72 29 3b 20 2f 2a 20 50 65 6e 64 69 6e 67  ger); /* Pending
2c830 20 6c 6f 63 6b 20 70 61 67 65 20 2a 2f 0a 20 20   lock page */.  
2c840 20 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20 64      const Pgno d
2c850 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
2c860 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a  dbSize;       /*
2c870 20 44 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   Database image 
2c880 73 69 7a 65 20 2a 2f 20 0a 20 20 20 20 20 20 70  size */ .      p
2c890 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
2c8a0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
2c8b0 7a 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 69  ze;.      for( i
2c8c0 3d 64 62 53 69 7a 65 2b 31 3b 20 69 3c 3d 70 50  =dbSize+1; i<=pP
2c8d0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
2c8e0 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20  ; i++ ){.       
2c8f0 20 69 66 28 20 21 73 71 6c 69 74 65 33 42 69 74   if( !sqlite3Bit
2c900 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
2c910 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29 20 26  pInJournal, i) &
2c920 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20  & i!=iSkip ){.  
2c930 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70          PgHdr *p
2c940 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
2c950 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 6a 6f 75    /* Page to jou
2c960 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20  rnal */.        
2c970 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2c980 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 69  gerGet(pPager, i
2c990 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20  , &pPage);.     
2c9a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2c9b0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f  ITE_OK ) goto co
2c9c0 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
2c9d0 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 72  xit;.          r
2c9e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2c9f0 57 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  Write(pPage);.  
2ca00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
2ca10 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
2ca20 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2ca30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2ca40 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73  goto commit_phas
2ca50 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20  e_one_exit;.    
2ca60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 0a 20      }.      } . 
2ca70 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
2ca80 69 7a 65 20 3d 20 64 62 53 69 7a 65 3b 0a 20 20  ize = dbSize;.  
2ca90 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
2caa0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61 73  /* Write the mas
2cab0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
2cac0 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
2cad0 6c 20 66 69 6c 65 2e 20 49 66 20 61 20 6d 61 73  l file. If a mas
2cae0 74 65 72 20 0a 20 20 20 20 2a 2a 20 6a 6f 75 72  ter .    ** jour
2caf0 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61  nal file name ha
2cb00 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
2cb10 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
2cb20 75 72 6e 61 6c 20 66 69 6c 65 2c 20 0a 20 20 20  urnal file, .   
2cb30 20 2a 2a 20 6f 72 20 69 66 20 7a 4d 61 73 74 65   ** or if zMaste
2cb40 72 20 69 73 20 4e 55 4c 4c 20 28 6e 6f 20 6d 61  r is NULL (no ma
2cb50 73 74 65 72 20 6a 6f 75 72 6e 61 6c 29 2c 20 74  ster journal), t
2cb60 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 20 69 73  hen this call is
2cb70 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f   a no-op..    */
2cb80 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d  .    rc = writeM
2cb90 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
2cba0 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ger, zMaster);. 
2cbb0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2cbc0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d  E_OK ) goto comm
2cbd0 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69  it_phase_one_exi
2cbe0 74 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20  t;..    /* Sync 
2cbf0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2cc00 2e 20 49 66 20 74 68 65 20 61 74 6f 6d 69 63 2d  . If the atomic-
2cc10 75 70 64 61 74 65 20 6f 70 74 69 6d 69 7a 61 74  update optimizat
2cc20 69 6f 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20  ion is being.   
2cc30 20 2a 2a 20 75 73 65 64 2c 20 74 68 69 73 20 63   ** used, this c
2cc40 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20 63 72 65  all will not cre
2cc50 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
2cc60 66 69 6c 65 20 6f 72 20 70 65 72 66 6f 72 6d 20  file or perform 
2cc70 61 6e 79 0a 20 20 20 20 2a 2a 20 72 65 61 6c 20  any.    ** real 
2cc80 49 4f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  IO..    */.    r
2cc90 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
2cca0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
2ccb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2ccc0 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
2ccd0 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20 20  se_one_exit;..  
2cce0 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64    /* Write all d
2ccf0 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68  irty pages to th
2cd00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd10 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
2cd20 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
2cd30 74 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  t(sqlite3PcacheD
2cd40 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
2cd50 3e 70 50 43 61 63 68 65 29 29 3b 0a 20 20 20 20  >pPCache));.    
2cd60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2cd70 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
2cd80 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  t( rc!=SQLITE_IO
2cd90 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20  ERR_BLOCKED );. 
2cda0 20 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74       goto commit
2cdb0 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
2cdc0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2cdd0 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
2cde0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2cdf0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
2ce00 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
2ce10 73 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 73  s not the same s
2ce20 69 7a 65 20 61 73 20 74 68 65 20 64 61 74 61 62  ize as the datab
2ce30 61 73 65 20 69 6d 61 67 65 2c 0a 20 20 20 20 2a  ase image,.    *
2ce40 2a 20 74 68 65 6e 20 75 73 65 20 70 61 67 65 72  * then use pager
2ce50 5f 74 72 75 6e 63 61 74 65 20 74 6f 20 67 72 6f  _truncate to gro
2ce60 77 20 6f 72 20 73 68 72 69 6e 6b 20 74 68 65 20  w or shrink the 
2ce70 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 2a  file here..    *
2ce80 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
2ce90 2d 3e 64 62 53 69 7a 65 21 3d 70 50 61 67 65 72  ->dbSize!=pPager
2cea0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a  ->dbFileSize ){.
2ceb0 20 20 20 20 20 20 50 67 6e 6f 20 6e 4e 65 77 20        Pgno nNew 
2cec0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
2ced0 20 2d 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69   - (pPager->dbSi
2cee0 7a 65 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ze==PAGER_MJ_PGN
2cef0 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  O(pPager));.    
2cf00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2cf10 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
2cf20 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 20 20  XCLUSIVE );.    
2cf30 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
2cf40 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 4e  ncate(pPager, nN
2cf50 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ew);.      if( r
2cf60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
2cf70 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65  oto commit_phase
2cf80 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 7d  _one_exit;.    }
2cf90 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79  ..    /* Finally
2cfa0 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  , sync the datab
2cfb0 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
2cfc0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
2cfd0 53 79 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63 20  Sync && !noSync 
2cfe0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
2cff0 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
2d000 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
2d010 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20  sync_flags);.   
2d020 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28   }.    IOTRACE((
2d030 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  "DBSYNC %p\n", p
2d040 50 61 67 65 72 29 29 0a 0a 20 20 20 20 70 50 61  Pager))..    pPa
2d050 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
2d060 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a  ER_SYNCED;.  }..
2d070 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
2d080 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 72 63 3d  _exit:.  if( rc=
2d090 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c  =SQLITE_IOERR_BL
2d0a0 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20  OCKED ){.    /* 
2d0b0 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
2d0c0 65 63 6f 75 6e 74 65 72 28 29 20 6d 61 79 20 61  ecounter() may a
2d0d0 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e  ttempt to obtain
2d0e0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 20 20   an exclusive.  
2d0f0 20 20 2a 2a 20 6c 6f 63 6b 20 74 6f 20 73 70 69    ** lock to spi
2d100 6c 6c 20 74 68 65 20 63 61 63 68 65 20 61 6e 64  ll the cache and
2d110 20 72 65 74 75 72 6e 20 49 4f 45 52 52 5f 42 4c   return IOERR_BL
2d120 4f 43 4b 45 44 2e 20 42 75 74 20 73 69 6e 63 65  OCKED. But since
2d130 20 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20 69   .    ** there i
2d140 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 65 20  s no chance the 
2d150 63 61 63 68 65 20 69 73 20 69 6e 63 6f 6e 73 69  cache is inconsi
2d160 73 74 65 6e 74 2c 20 69 74 20 69 73 0a 20 20 20  stent, it is.   
2d170 20 2a 2a 20 62 65 74 74 65 72 20 74 6f 20 72 65   ** better to re
2d180 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
2d190 2e 0a 20 20 20 20 2a 2a 2f 0a 20 20 20 20 72 63  ..    **/.    rc
2d1a0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
2d1b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2d1c0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  .}.../*.** When 
2d1d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2d1e0 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 64 61 74   called, the dat
2d1f0 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62  abase file has b
2d200 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 2a  een completely.*
2d210 2a 20 75 70 64 61 74 65 64 20 74 6f 20 72 65 66  * updated to ref
2d220 6c 65 63 74 20 74 68 65 20 63 68 61 6e 67 65 73  lect the changes
2d230 20 6d 61 64 65 20 62 79 20 74 68 65 20 63 75 72   made by the cur
2d240 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
2d250 20 61 6e 64 0a 2a 2a 20 73 79 6e 63 65 64 20 74   and.** synced t
2d260 6f 20 64 69 73 6b 2e 20 54 68 65 20 6a 6f 75 72  o disk. The jour
2d270 6e 61 6c 20 66 69 6c 65 20 73 74 69 6c 6c 20 65  nal file still e
2d280 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c  xists in the fil
2d290 65 2d 73 79 73 74 65 6d 20 0a 2a 2a 20 74 68 6f  e-system .** tho
2d2a0 75 67 68 2c 20 61 6e 64 20 69 66 20 61 20 66 61  ugh, and if a fa
2d2b0 69 6c 75 72 65 20 6f 63 63 75 72 73 20 61 74 20  ilure occurs at 
2d2c0 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 69  this point it wi
2d2d0 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a  ll eventually.**
2d2e0 20 62 65 20 75 73 65 64 20 61 73 20 61 20 68 6f   be used as a ho
2d2f0 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  t-journal and th
2d300 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
2d310 63 74 69 6f 6e 20 72 6f 6c 6c 65 64 20 62 61 63  ction rolled bac
2d320 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  k..**.** This fu
2d330 6e 63 74 69 6f 6e 20 66 69 6e 61 6c 69 7a 65 73  nction finalizes
2d340 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2d350 65 2c 20 65 69 74 68 65 72 20 62 79 20 64 65 6c  e, either by del
2d360 65 74 69 6e 67 2c 20 0a 2a 2a 20 74 72 75 6e 63  eting, .** trunc
2d370 61 74 69 6e 67 20 6f 72 20 70 61 72 74 69 61 6c  ating or partial
2d380 6c 79 20 7a 65 72 6f 69 6e 67 20 69 74 2c 20 73  ly zeroing it, s
2d390 6f 20 74 68 61 74 20 69 74 20 63 61 6e 6e 6f 74  o that it cannot
2d3a0 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72   be used .** for
2d3b0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
2d3c0 6c 62 61 63 6b 2e 20 4f 6e 63 65 20 74 68 69 73  lback. Once this
2d3d0 20 69 73 20 64 6f 6e 65 20 74 68 65 20 74 72 61   is done the tra
2d3e0 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 69  nsaction is.** i
2d3f0 72 72 65 76 6f 63 61 62 6c 79 20 63 6f 6d 6d 69  rrevocably commi
2d400 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tted..**.** If a
2d410 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2d420 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
2d430 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
2d440 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 6d 6f   the pager.** mo
2d450 76 65 73 20 69 6e 74 6f 20 74 68 65 20 65 72 72  ves into the err
2d460 6f 72 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77  or state. Otherw
2d470 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ise, SQLITE_OK i
2d480 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
2d490 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
2d4a0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 50 61  ommitPhaseTwo(Pa
2d4b0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2d4c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2d4d0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
2d4e0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2d4f0 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20  ode */..  /* Do 
2d500 6e 6f 74 20 70 72 6f 63 65 65 64 20 69 66 20 74  not proceed if t
2d510 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 72 65  he pager is alre
2d520 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72  ady in the error
2d530 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28   state. */.  if(
2d540 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2d550 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
2d560 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
2d570 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66    }..  /* This f
2d580 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e  unction should n
2d590 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20  ot be called if 
2d5a0 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
2d5b0 20 69 6e 20 61 74 20 6c 65 61 73 74 0a 20 20 2a   in at least.  *
2d5c0 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  * PAGER_RESERVED
2d5d0 20 73 74 61 74 65 2e 20 41 6e 64 20 69 6e 64 65   state. And inde
2d5e0 65 64 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20  ed SQLite never 
2d5f0 64 6f 65 73 20 74 68 69 73 2e 20 42 75 74 20 69  does this. But i
2d600 74 20 69 73 0a 20 20 2a 2a 20 6e 69 63 65 20 74  t is.  ** nice t
2d610 6f 20 68 61 76 65 20 74 68 69 73 20 64 65 66 65  o have this defe
2d620 6e 73 69 76 65 20 62 6c 6f 63 6b 20 68 65 72 65  nsive block here
2d630 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2f 0a 20 20   anyway..  */.  
2d640 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
2d650 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
2d660 53 45 52 56 45 44 29 20 29 7b 0a 20 20 20 20 72  SERVED) ){.    r
2d670 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
2d680 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e  OR;.  }..  /* An
2d690 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 49   optimization. I
2d6a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  f the database w
2d6b0 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  as not actually 
2d6c0 6d 6f 64 69 66 69 65 64 20 64 75 72 69 6e 67 0a  modified during.
2d6d0 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61    ** this transa
2d6e0 63 74 69 6f 6e 2c 20 74 68 65 20 70 61 67 65 72  ction, the pager
2d6f0 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
2d700 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 61 6e  xclusive-mode an
2d710 64 20 69 73 0a 20 20 2a 2a 20 75 73 69 6e 67 20  d is.  ** using 
2d720 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e  persistent journ
2d730 61 6c 73 2c 20 74 68 65 6e 20 74 68 69 73 20 66  als, then this f
2d740 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
2d750 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  op..  **.  ** Th
2d760 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
2d770 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72  ournal file curr
2d780 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 20 61  ently contains a
2d790 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 20   single journal 
2d7a0 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77 69 74  .  ** header wit
2d7b0 68 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  h the nRec field
2d7c0 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 73 75   set to 0. If su
2d7d0 63 68 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ch a journal is 
2d7e0 75 73 65 64 20 61 73 0a 20 20 2a 2a 20 61 20 68  used as.  ** a h
2d7f0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 64 75 72 69 6e  ot-journal durin
2d800 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  g hot-journal ro
2d810 6c 6c 62 61 63 6b 2c 20 30 20 63 68 61 6e 67 65  llback, 0 change
2d820 73 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 0a 20  s will be made. 
2d830 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62   ** to the datab
2d840 61 73 65 20 66 69 6c 65 2e 20 53 6f 20 74 68 65  ase file. So the
2d850 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
2d860 20 7a 65 72 6f 20 74 68 65 20 6a 6f 75 72 6e 61   zero the journa
2d870 6c 20 0a 20 20 2a 2a 20 68 65 61 64 65 72 2e 20  l .  ** header. 
2d880 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 72 20  Since the pager 
2d890 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  is in exclusive 
2d8a0 6d 6f 64 65 2c 20 74 68 65 72 65 20 69 73 20 6e  mode, there is n
2d8b0 6f 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20 64  o need.  ** to d
2d8c0 72 6f 70 20 61 6e 79 20 6c 6f 63 6b 73 20 65 69  rop any locks ei
2d8d0 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ther..  */.  if(
2d8e0 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
2d8f0 69 65 64 3d 3d 30 20 26 26 20 70 50 61 67 65 72  ied==0 && pPager
2d900 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
2d910 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  .   && pPager->j
2d920 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
2d930 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
2d940 52 53 49 53 54 0a 20 20 29 7b 0a 20 20 20 20 61  RSIST.  ){.    a
2d950 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
2d960 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
2d970 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
2d980 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) );.    return 
2d990 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
2d9a0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43    PAGERTRACE(("C
2d9b0 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47  OMMIT %d\n", PAG
2d9c0 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
2d9d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2d9e0 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
2d9f0 59 4e 43 45 44 20 7c 7c 20 4d 45 4d 44 42 20 7c  YNCED || MEMDB |
2da00 7c 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  | !pPager->dbMod
2da10 69 66 69 65 64 20 29 3b 0a 20 20 72 63 20 3d 20  ified );.  rc = 
2da20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
2da30 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50  ction(pPager, pP
2da40 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29  ager->setMaster)
2da50 3b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  ;.  return pager
2da60 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
2da70 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  c);.}../*.** Rol
2da80 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65  lback all change
2da90 73 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20  s. The database 
2daa0 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41  falls back to PA
2dab0 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e  GER_SHARED mode.
2dac0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
2dad0 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 77  tion performs tw
2dae0 6f 20 74 61 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20  o tasks:.**.**  
2daf0 20 31 29 20 49 74 20 72 6f 6c 6c 73 20 62 61 63   1) It rolls bac
2db00 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  k the journal fi
2db10 6c 65 2c 20 72 65 73 74 6f 72 69 6e 67 20 61 6c  le, restoring al
2db20 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  l database file 
2db30 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 69 6e 2d  and .**      in-
2db40 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67  memory cache pag
2db50 65 73 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  es to the state 
2db60 74 68 65 79 20 77 65 72 65 20 69 6e 20 77 68 65  they were in whe
2db70 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
2db80 6e 0a 2a 2a 20 20 20 20 20 20 77 61 73 20 6f 70  n.**      was op
2db90 65 6e 65 64 2c 20 61 6e 64 0a 2a 2a 20 20 20 32  ened, and.**   2
2dba0 29 20 49 74 20 66 69 6e 61 6c 69 7a 65 73 20 74  ) It finalizes t
2dbb0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
2dbc0 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e   so that it is n
2dbd0 6f 74 20 75 73 65 64 20 66 6f 72 20 68 6f 74 0a  ot used for hot.
2dbe0 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b  **      rollback
2dbf0 20 61 74 20 61 6e 79 20 70 6f 69 6e 74 20 69 6e   at any point in
2dc00 20 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 0a   the future..**.
2dc10 2a 2a 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68  ** subject to th
2dc20 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 61 6c  e following qual
2dc30 69 66 69 63 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a  ifications:.**.*
2dc40 2a 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  * * If the journ
2dc50 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 79  al file is not y
2dc60 65 74 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  et open when thi
2dc70 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2dc80 6c 6c 65 64 2c 0a 2a 2a 20 20 20 74 68 65 6e 20  lled,.**   then 
2dc90 6f 6e 6c 79 20 28 32 29 20 69 73 20 70 65 72 66  only (2) is perf
2dca0 6f 72 6d 65 64 2e 20 49 6e 20 74 68 69 73 20 63  ormed. In this c
2dcb0 61 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ase there is no 
2dcc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
2dcd0 20 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a    to roll back..
2dce0 2a 2a 0a 2a 2a 20 2a 20 49 66 20 69 6e 20 61 6e  **.** * If in an
2dcf0 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68   error state oth
2dd00 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46  er than SQLITE_F
2dd10 55 4c 4c 2c 20 74 68 65 6e 20 74 61 73 6b 20 28  ULL, then task (
2dd20 31 29 20 69 73 20 0a 2a 2a 20 20 20 70 65 72 66  1) is .**   perf
2dd30 6f 72 6d 65 64 2e 20 49 66 20 73 75 63 63 65 73  ormed. If succes
2dd40 73 66 75 6c 2c 20 74 61 73 6b 20 28 32 29 2e 20  sful, task (2). 
2dd50 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
2dd60 65 20 6f 75 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f  e outcome.**   o
2dd70 66 20 65 69 74 68 65 72 2c 20 74 68 65 20 65 72  f either, the er
2dd80 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
2dd90 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2dda0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 0a 2a   to the caller.*
2ddb0 2a 20 20 20 28 69 2e 65 2e 20 65 69 74 68 65 72  *   (i.e. either
2ddc0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72   SQLITE_IOERR or
2ddd0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29   SQLITE_CORRUPT)
2dde0 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65  ..**.** * If the
2ddf0 20 70 61 67 65 72 20 69 73 20 69 6e 20 50 41 47   pager is in PAG
2de00 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74  ER_RESERVED stat
2de10 65 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20  e, then attempt 
2de20 28 31 29 2e 20 57 68 65 74 68 65 72 0a 2a 2a 20  (1). Whether.** 
2de30 20 20 6f 72 20 6e 6f 74 20 28 31 29 20 69 73 20    or not (1) is 
2de40 73 75 63 63 75 73 73 66 75 6c 2c 20 61 6c 73 6f  succussful, also
2de50 20 61 74 74 65 6d 70 74 20 28 32 29 2e 20 49 66   attempt (2). If
2de60 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
2de70 75 72 6e 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f  urn.**   SQLITE_
2de80 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65  OK. Otherwise, e
2de90 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73  nter the error s
2dea0 74 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  tate and return 
2deb0 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 20 20  the first .**   
2dec0 65 72 72 6f 72 20 63 6f 64 65 20 65 6e 63 6f 75  error code encou
2ded0 6e 74 65 72 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20  ntered. .**.**  
2dee0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
2def0 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
2df00 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
2df10 73 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 74  se was written t
2df20 6f 2e 20 0a 2a 2a 20 20 20 53 6f 20 69 73 20 73  o. .**   So is s
2df30 61 66 65 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  afe to finalize 
2df40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2df50 20 65 76 65 6e 20 69 66 20 74 68 65 20 70 6c 61   even if the pla
2df60 79 62 61 63 6b 20 0a 2a 2a 20 20 20 28 6f 70 65  yback .**   (ope
2df70 72 61 74 69 6f 6e 20 31 29 20 66 61 69 6c 65 64  ration 1) failed
2df80 2e 20 48 6f 77 65 76 65 72 20 74 68 65 20 70 61  . However the pa
2df90 67 65 72 20 6d 75 73 74 20 65 6e 74 65 72 20 74  ger must enter t
2dfa0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 2a  he error state.*
2dfb0 2a 20 20 20 61 73 20 74 68 65 20 63 6f 6e 74 65  *   as the conte
2dfc0 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65  nts of the in-me
2dfd0 6d 6f 72 79 20 63 61 63 68 65 20 61 72 65 20 6e  mory cache are n
2dfe0 6f 77 20 73 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a  ow suspect..**.*
2dff0 2a 20 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20  * * Finally, if 
2e000 69 6e 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  in PAGER_EXCLUSI
2e010 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 61  VE state, then a
2e020 74 74 65 6d 70 74 20 28 31 29 2e 20 4f 6e 6c 79  ttempt (1). Only
2e030 0a 2a 2a 20 20 20 61 74 74 65 6d 70 74 20 28 32  .**   attempt (2
2e040 29 20 69 66 20 28 31 29 20 69 73 20 73 75 63 63  ) if (1) is succ
2e050 65 73 73 66 75 6c 2e 20 52 65 74 75 72 6e 20 53  essful. Return S
2e060 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
2e070 65 73 73 66 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68  essful,.**   oth
2e080 65 72 77 69 73 65 20 65 6e 74 65 72 20 74 68 65  erwise enter the
2e090 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64   error state and
2e0a0 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
2e0b0 72 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 65 20  r code from the 
2e0c0 0a 2a 2a 20 20 20 66 61 69 6c 69 6e 67 20 6f 70  .**   failing op
2e0d0 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  eration..**.**  
2e0e0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
2e0f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2e100 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 77 72  may have been wr
2e110 69 74 74 65 6e 20 74 6f 2e 20 53 6f 20 69 66 20  itten to. So if 
2e120 74 68 65 0a 2a 2a 20 20 20 70 6c 61 79 62 61 63  the.**   playbac
2e130 6b 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 64 20  k operation did 
2e140 6e 6f 74 20 73 75 63 63 65 65 64 20 69 74 20 77  not succeed it w
2e150 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 61 66 65  ould not be safe
2e160 20 74 6f 20 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20   to finalize.** 
2e170 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    the journal fi
2e180 6c 65 2e 20 49 74 20 6e 65 65 64 73 20 74 6f 20  le. It needs to 
2e190 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
2e1a0 69 6c 65 2d 73 79 73 74 65 6d 20 73 6f 20 74 68  ile-system so th
2e1b0 61 74 0a 2a 2a 20 20 20 73 6f 6d 65 20 6f 74 68  at.**   some oth
2e1c0 65 72 20 70 72 6f 63 65 73 73 20 63 61 6e 20 75  er process can u
2e1d0 73 65 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65  se it to restore
2e1e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 74   the database st
2e1f0 61 74 65 20 28 62 79 0a 2a 2a 20 20 20 68 6f 74  ate (by.**   hot
2e200 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
2e210 6b 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  k)..*/.int sqlit
2e220 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
2e230 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2e240 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2e250 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2e260 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2e270 20 63 6f 64 65 20 2a 2f 0a 20 20 50 41 47 45 52   code */.  PAGER
2e280 54 52 41 43 45 28 28 22 52 4f 4c 4c 42 41 43 4b  TRACE(("ROLLBACK
2e290 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
2e2a0 70 50 61 67 65 72 29 29 29 3b 0a 20 20 69 66 28  pPager)));.  if(
2e2b0 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69   !pPager->dbModi
2e2c0 66 69 65 64 20 7c 7c 20 21 69 73 4f 70 65 6e 28  fied || !isOpen(
2e2d0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
2e2e0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
2e2f0 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
2e300 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
2e310 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 7d 65 6c  etMaster);.  }el
2e320 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  se if( pPager->e
2e330 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72  rrCode && pPager
2e340 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
2e350 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66  E_FULL ){.    if
2e360 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
2e370 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
2e380 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
2e390 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
2e3a0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   0);.    }.    r
2e3b0 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
2e3c0 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ode;.  }else{.  
2e3d0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
2e3e0 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
2e3f0 56 45 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  VED ){.      int
2e400 20 72 63 32 3b 0a 20 20 20 20 20 20 72 63 20 3d   rc2;.      rc =
2e410 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
2e420 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
2e430 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e    rc2 = pager_en
2e440 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
2e450 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65  ager, pPager->se
2e460 74 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  tMaster);.      
2e470 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2e480 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
2e490 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20  = rc2;.      }. 
2e4a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e4b0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
2e4c0 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
2e4d0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
2e4e0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70  MEMDB ){.      p
2e4f0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
2e500 69 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  id = 0;.    }.. 
2e510 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f     /* If an erro
2e520 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
2e530 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63  a ROLLBACK, we c
2e540 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75  an no longer tru
2e550 73 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  st the pager.   
2e560 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61   ** cache. So ca
2e570 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29  ll pager_error()
2e580 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20   on the way out 
2e590 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f  to make any erro
2e5a0 72 20 0a 20 20 20 20 2a 2a 20 70 65 72 73 69 73  r .    ** persis
2e5b0 74 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tent..    */.   
2e5c0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f   rc = pager_erro
2e5d0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
2e5e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2e5f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2e600 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74 61  TRUE if the data
2e610 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65  base file is ope
2e620 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20  ned read-only.  
2e630 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
2e640 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
2e650 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77  is (in theory) w
2e660 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73  ritable..*/.u8 s
2e670 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
2e680 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61  donly(Pager *pPa
2e690 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
2e6a0 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b  Pager->readOnly;
2e6b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2e6c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
2e6d0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
2e6e0 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73   pager..*/.int s
2e6f0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
2e700 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
2e710 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  r){.  return sql
2e720 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
2e730 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
2e740 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  he);.}../*.** Re
2e750 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
2e760 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
2e770 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
2e780 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  age..*/.int sqli
2e790 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
2e7a0 6f 75 6e 74 28 44 62 50 61 67 65 20 2a 70 50 61  ount(DbPage *pPa
2e7b0 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  ge){.  return sq
2e7c0 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52  lite3PcachePageR
2e7d0 65 66 63 6f 75 6e 74 28 70 50 61 67 65 29 3b 0a  efcount(pPage);.
2e7e0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
2e7f0 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73  _TEST./*.** This
2e800 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
2e810 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
2e820 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a   analysis only..
2e830 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50  */.int *sqlite3P
2e840 61 67 65 72 53 74 61 74 73 28 50 61 67 65 72 20  agerStats(Pager 
2e850 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74  *pPager){.  stat
2e860 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20  ic int a[11];.  
2e870 61 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 50 63  a[0] = sqlite3Pc
2e880 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
2e890 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
2e8a0 20 61 5b 31 5d 20 3d 20 73 71 6c 69 74 65 33 50   a[1] = sqlite3P
2e8b0 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70  cachePagecount(p
2e8c0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
2e8d0 0a 20 20 61 5b 32 5d 20 3d 20 73 71 6c 69 74 65  .  a[2] = sqlite
2e8e0 33 50 63 61 63 68 65 47 65 74 43 61 63 68 65 73  3PcacheGetCaches
2e8f0 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
2e900 63 68 65 29 3b 0a 20 20 61 5b 33 5d 20 3d 20 70  che);.  a[3] = p
2e910 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
2e920 69 64 20 3f 20 28 69 6e 74 29 20 70 50 61 67 65  id ? (int) pPage
2e930 72 2d 3e 64 62 53 69 7a 65 20 3a 20 2d 31 3b 0a  r->dbSize : -1;.
2e940 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d    a[4] = pPager-
2e950 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d  >state;.  a[5] =
2e960 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2e970 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65  ;.  a[6] = pPage
2e980 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20  r->nHit;.  a[7] 
2e990 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b  = pPager->nMiss;
2e9a0 0a 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a  .  a[8] = 0;  /*
2e9b0 20 55 73 65 64 20 74 6f 20 62 65 20 70 50 61 67   Used to be pPag
2e9c0 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61  er->nOvfl */.  a
2e9d0 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52  [9] = pPager->nR
2e9e0 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70  ead;.  a[10] = p
2e9f0 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20  Pager->nWrite;. 
2ea00 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e   return a;.}.#en
2ea10 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
2ea20 6e 20 74 72 75 65 20 69 66 20 74 68 69 73 20 69  n true if this i
2ea30 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  s an in-memory p
2ea40 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ager..*/.int sql
2ea50 69 74 65 33 50 61 67 65 72 49 73 4d 65 6d 64 62  ite3PagerIsMemdb
2ea60 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2ea70 0a 20 20 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b  .  return MEMDB;
2ea80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
2ea90 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20 61  that there are a
2eaa0 74 20 6c 65 61 73 74 20 6e 53 61 76 65 70 6f 69  t least nSavepoi
2eab0 6e 74 20 73 61 76 65 70 6f 69 6e 74 73 20 6f 70  nt savepoints op
2eac0 65 6e 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  en. If there are
2ead0 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 6c 65  .** currently le
2eae0 73 73 20 74 68 61 6e 20 6e 53 61 76 65 70 6f 69  ss than nSavepoi
2eaf0 6e 74 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 6f  nts open, then o
2eb00 70 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  pen one or more 
2eb10 73 61 76 65 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f  savepoints.** to
2eb20 20 6d 61 6b 65 20 75 70 20 74 68 65 20 64 69 66   make up the dif
2eb30 66 65 72 65 6e 63 65 2e 20 49 66 20 74 68 65 20  ference. If the 
2eb40 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f  number of savepo
2eb50 69 6e 74 73 20 69 73 20 61 6c 72 65 61 64 79 0a  ints is already.
2eb60 2a 2a 20 65 71 75 61 6c 20 74 6f 20 6e 53 61 76  ** equal to nSav
2eb70 65 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69  epoint, then thi
2eb80 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
2eb90 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
2eba0 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
2ebb0 69 6f 6e 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  ion fails, SQLIT
2ebc0 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
2ebd0 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ned. If an error
2ebe0 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c   .** occurs whil
2ebf0 65 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 73 75  e opening the su
2ec00 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  b-journal file, 
2ec10 74 68 65 6e 20 61 6e 20 49 4f 20 65 72 72 6f 72  then an IO error
2ec20 20 63 6f 64 65 20 69 73 0a 2a 2a 20 72 65 74 75   code is.** retu
2ec30 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
2ec40 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
2ec50 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
2ec60 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 50 61 67  penSavepoint(Pag
2ec70 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
2ec80 6e 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  nSavepoint){.  i
2ec90 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2eca0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
2ecb0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2ecc0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
2ecd0 20 6e 43 75 72 72 65 6e 74 20 3d 20 70 50 61 67   nCurrent = pPag
2ece0 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
2ecf0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
2ed00 74 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65  t number of save
2ed10 70 6f 69 6e 74 73 20 2a 2f 0a 0a 20 20 69 66 28  points */..  if(
2ed20 20 6e 53 61 76 65 70 6f 69 6e 74 3e 6e 43 75 72   nSavepoint>nCur
2ed30 72 65 6e 74 20 26 26 20 70 50 61 67 65 72 2d 3e  rent && pPager->
2ed40 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  useJournal ){.  
2ed50 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
2ed60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
2ed80 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
2ed90 2f 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  /.    PagerSavep
2eda0 6f 69 6e 74 20 2a 61 4e 65 77 3b 20 20 20 20 20  oint *aNew;     
2edb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2edc0 20 4e 65 77 20 50 61 67 65 72 2e 61 53 61 76 65   New Pager.aSave
2edd0 70 6f 69 6e 74 20 61 72 72 61 79 20 2a 2f 0a 0a  point array */..
2ede0 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68      /* Either th
2edf0 65 72 65 20 69 73 20 6e 6f 20 61 63 74 69 76 65  ere is no active
2ee00 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20   journal or the 
2ee10 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  sub-journal is o
2ee20 70 65 6e 20 6f 72 20 0a 20 20 20 20 2a 2a 20 74  pen or .    ** t
2ee30 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c  he journal is al
2ee40 77 61 79 73 20 73 74 6f 72 65 64 20 69 6e 20 6d  ways stored in m
2ee50 65 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 61 73 73  emory */.    ass
2ee60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61  ert( pPager->nSa
2ee70 76 65 70 6f 69 6e 74 3d 3d 30 20 7c 7c 20 69 73  vepoint==0 || is
2ee80 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
2ee90 64 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  d) ||.          
2eea0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2eeb0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
2eec0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
2eed0 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20  );..    /* Grow 
2eee0 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65 70  the Pager.aSavep
2eef0 6f 69 6e 74 20 61 72 72 61 79 20 75 73 69 6e 67  oint array using
2ef00 20 72 65 61 6c 6c 6f 63 28 29 2e 20 52 65 74 75   realloc(). Retu
2ef10 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  rn SQLITE_NOMEM.
2ef20 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 61 6c      ** if the al
2ef30 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2e 20  location fails. 
2ef40 4f 74 68 65 72 77 69 73 65 2c 20 7a 65 72 6f 20  Otherwise, zero 
2ef50 74 68 65 20 6e 65 77 20 70 6f 72 74 69 6f 6e 20  the new portion 
2ef60 69 6e 20 63 61 73 65 20 61 20 0a 20 20 20 20 2a  in case a .    *
2ef70 2a 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  * malloc failure
2ef80 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70 6f   occurs while po
2ef90 70 75 6c 61 74 69 6e 67 20 69 74 20 69 6e 20 74  pulating it in t
2efa0 68 65 20 66 6f 72 28 2e 2e 2e 29 20 6c 6f 6f 70  he for(...) loop
2efb0 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20   below..    */. 
2efc0 20 20 20 61 4e 65 77 20 3d 20 28 50 61 67 65 72     aNew = (Pager
2efd0 53 61 76 65 70 6f 69 6e 74 20 2a 29 73 71 6c 69  Savepoint *)sqli
2efe0 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20  te3Realloc(.    
2eff0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76      pPager->aSav
2f000 65 70 6f 69 6e 74 2c 20 73 69 7a 65 6f 66 28 50  epoint, sizeof(P
2f010 61 67 65 72 53 61 76 65 70 6f 69 6e 74 29 2a 6e  agerSavepoint)*n
2f020 53 61 76 65 70 6f 69 6e 74 0a 20 20 20 20 29 3b  Savepoint.    );
2f030 0a 20 20 20 20 69 66 28 20 21 61 4e 65 77 20 29  .    if( !aNew )
2f040 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2f050 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2f060 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 61   }.    memset(&a
2f070 4e 65 77 5b 6e 43 75 72 72 65 6e 74 5d 2c 20 30  New[nCurrent], 0
2f080 2c 20 28 6e 53 61 76 65 70 6f 69 6e 74 2d 6e 43  , (nSavepoint-nC
2f090 75 72 72 65 6e 74 29 20 2a 20 73 69 7a 65 6f 66  urrent) * sizeof
2f0a0 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 29  (PagerSavepoint)
2f0b0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
2f0c0 53 61 76 65 70 6f 69 6e 74 20 3d 20 61 4e 65 77  Savepoint = aNew
2f0d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53  ;.    pPager->nS
2f0e0 61 76 65 70 6f 69 6e 74 20 3d 20 6e 53 61 76 65  avepoint = nSave
2f0f0 70 6f 69 6e 74 3b 0a 0a 20 20 20 20 2f 2a 20 50  point;..    /* P
2f100 6f 70 75 6c 61 74 65 20 74 68 65 20 50 61 67 65  opulate the Page
2f110 72 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63  rSavepoint struc
2f120 74 75 72 65 73 20 6a 75 73 74 20 61 6c 6c 6f 63  tures just alloc
2f130 61 74 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  ated. */.    for
2f140 28 69 69 3d 6e 43 75 72 72 65 6e 74 3b 20 69 69  (ii=nCurrent; ii
2f150 3c 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  <nSavepoint; ii+
2f160 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
2f170 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
2f180 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 20 20 61  Valid );.      a
2f190 4e 65 77 5b 69 69 5d 2e 6e 4f 72 69 67 20 3d 20  New[ii].nOrig = 
2f1a0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
2f1b0 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e        if( isOpen
2f1c0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
2f1d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2f1e0 4f 66 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  Off>0 ){.       
2f1f0 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65   aNew[ii].iOffse
2f200 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
2f210 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65  nalOff;.      }e
2f220 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 4e 65  lse{.        aNe
2f230 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20  w[ii].iOffset = 
2f240 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
2f250 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Pager);.      }.
2f260 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69        aNew[ii].i
2f270 53 75 62 52 65 63 20 3d 20 70 50 61 67 65 72 2d  SubRec = pPager-
2f280 3e 6e 53 75 62 52 65 63 3b 0a 20 20 20 20 20 20  >nSubRec;.      
2f290 61 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65  aNew[ii].pInSave
2f2a0 70 6f 69 6e 74 20 3d 20 73 71 6c 69 74 65 33 42  point = sqlite3B
2f2b0 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67  itvecCreate(pPag
2f2c0 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20  er->dbSize);.   
2f2d0 20 20 20 69 66 28 20 21 61 4e 65 77 5b 69 69 5d     if( !aNew[ii]
2f2e0 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b  .pInSavepoint ){
2f2f0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2f300 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2f310 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2f320 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62   /* Open the sub
2f330 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20  -journal, if it 
2f340 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
2f350 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 72 63  pened. */.    rc
2f360 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61   = openSubJourna
2f370 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  l(pPager);.  }..
2f380 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2f390 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2f3a0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
2f3b0 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c   rollback or rel
2f3c0 65 61 73 65 20 28 63 6f 6d 6d 69 74 29 20 61 20  ease (commit) a 
2f3d0 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 20 54 68  savepoint..** Th
2f3e0 65 20 73 61 76 65 70 6f 69 6e 74 20 74 6f 20 72  e savepoint to r
2f3f0 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61  elease or rollba
2f400 63 6b 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 74  ck need not be t
2f410 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
2f420 20 0a 2a 2a 20 63 72 65 61 74 65 64 20 73 61 76   .** created sav
2f430 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 50 61  epoint..**.** Pa
2f440 72 61 6d 65 74 65 72 20 6f 70 20 69 73 20 61 6c  rameter op is al
2f450 77 61 79 73 20 65 69 74 68 65 72 20 53 41 56 45  ways either SAVE
2f460 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f  POINT_ROLLBACK o
2f470 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  r SAVEPOINT_RELE
2f480 41 53 45 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73  ASE..** If it is
2f490 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
2f4a0 53 45 2c 20 74 68 65 6e 20 72 65 6c 65 61 73 65  SE, then release
2f4b0 20 61 6e 64 20 64 65 73 74 72 6f 79 20 74 68 65   and destroy the
2f4c0 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a   savepoint with.
2f4d0 2a 2a 20 69 6e 64 65 78 20 69 53 61 76 65 70 6f  ** index iSavepo
2f4e0 69 6e 74 2e 20 49 66 20 69 74 20 69 73 20 53 41  int. If it is SA
2f4f0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
2f500 2c 20 74 68 65 6e 20 72 6f 6c 6c 62 61 63 6b 20  , then rollback 
2f510 61 6c 6c 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74  all changes.** t
2f520 68 61 74 20 68 61 76 65 20 6f 63 63 75 72 72 65  hat have occurre
2f530 64 20 73 69 6e 63 65 20 74 68 65 20 73 70 65 63  d since the spec
2f540 69 66 69 65 64 20 73 61 76 65 70 6f 69 6e 74 20  ified savepoint 
2f550 77 61 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a  was created..**.
2f560 2a 2a 20 54 68 65 20 73 61 76 65 70 6f 69 6e 74  ** The savepoint
2f570 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20   to rollback or 
2f580 72 65 6c 65 61 73 65 20 69 73 20 69 64 65 6e 74  release is ident
2f590 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
2f5a0 65 72 20 0a 2a 2a 20 69 53 61 76 65 70 6f 69 6e  er .** iSavepoin
2f5b0 74 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20  t. A value of 0 
2f5c0 6d 65 61 6e 73 20 74 6f 20 6f 70 65 72 61 74 65  means to operate
2f5d0 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 6d 6f 73   on the outermos
2f5e0 74 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 28  t savepoint.** (
2f5f0 74 68 65 20 66 69 72 73 74 20 63 72 65 61 74 65  the first create
2f600 64 29 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 28  d). A value of (
2f610 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74  Pager.nSavepoint
2f620 2d 31 29 20 6d 65 61 6e 73 20 6f 70 65 72 61 74  -1) means operat
2f630 65 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e.** on the most
2f640 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65   recently create
2f650 64 20 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20  d savepoint. If 
2f660 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72  iSavepoint is gr
2f670 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 28 50  eater than.** (P
2f680 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d  ager.nSavepoint-
2f690 31 29 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  1), then this fu
2f6a0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
2f6b0 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 65  p..**.** If a ne
2f6c0 67 61 74 69 76 65 20 76 61 6c 75 65 20 69 73 20  gative value is 
2f6d0 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
2f6e0 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68  unction, then th
2f6f0 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61  e current.** tra
2f700 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
2f710 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73  ed back. This is
2f720 20 64 69 66 66 65 72 65 6e 74 20 74 6f 20 63 61   different to ca
2f730 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65  lling .** sqlite
2f740 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29  3PagerRollback()
2f750 20 62 65 63 61 75 73 65 20 74 68 69 73 20 66 75   because this fu
2f760 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
2f770 74 65 72 6d 69 6e 61 74 65 0a 2a 2a 20 74 68 65  terminate.** the
2f780 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20   transaction or 
2f790 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  unlock the datab
2f7a0 61 73 65 2c 20 69 74 20 6a 75 73 74 20 72 65 73  ase, it just res
2f7b0 74 6f 72 65 73 20 74 68 65 20 0a 2a 2a 20 63 6f  tores the .** co
2f7c0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61  ntents of the da
2f7d0 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
2f7e0 69 67 69 6e 61 6c 20 73 74 61 74 65 2e 20 0a 2a  iginal state. .*
2f7f0 2a 0a 2a 2a 20 49 6e 20 61 6e 79 20 63 61 73 65  *.** In any case
2f800 2c 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73  , all savepoints
2f810 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 67   with an index g
2f820 72 65 61 74 65 72 20 74 68 61 6e 20 69 53 61 76  reater than iSav
2f830 65 70 6f 69 6e 74 20 0a 2a 2a 20 61 72 65 20 64  epoint .** are d
2f840 65 73 74 72 6f 79 65 64 2e 20 49 66 20 74 68 69  estroyed. If thi
2f850 73 20 69 73 20 61 20 72 65 6c 65 61 73 65 20 6f  s is a release o
2f860 70 65 72 61 74 69 6f 6e 20 28 6f 70 3d 3d 53 41  peration (op==SA
2f870 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29  VEPOINT_RELEASE)
2f880 2c 0a 2a 2a 20 74 68 65 6e 20 73 61 76 65 70 6f  ,.** then savepo
2f890 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20 69  int iSavepoint i
2f8a0 73 20 61 6c 73 6f 20 64 65 73 74 72 6f 79 65 64  s also destroyed
2f8b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2f8c0 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e  ction may return
2f8d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
2f8e0 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
2f8f0 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 6f  tion fails,.** o
2f900 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  r an IO error co
2f910 64 65 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f  de if an IO erro
2f920 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72  r occurs while r
2f930 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 0a 2a  olling back a .*
2f940 2a 20 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20  * savepoint. If 
2f950 6e 6f 20 65 72 72 6f 72 73 20 6f 63 63 75 72 2c  no errors occur,
2f960 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2f970 74 75 72 6e 65 64 2e 0a 2a 2f 20 0a 69 6e 74 20  turned..*/ .int 
2f980 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65  sqlite3PagerSave
2f990 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61  point(Pager *pPa
2f9a0 67 65 72 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74  ger, int op, int
2f9b0 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20   iSavepoint){.  
2f9c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2f9d0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6f  OK;..  assert( o
2f9e0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
2f9f0 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45  EASE || op==SAVE
2fa00 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
2fa10 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 61 76  ;.  assert( iSav
2fa20 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 6f 70 3d  epoint>=0 || op=
2fa30 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
2fa40 41 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 69 53  ACK );..  if( iS
2fa50 61 76 65 70 6f 69 6e 74 3c 70 50 61 67 65 72 2d  avepoint<pPager-
2fa60 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20  >nSavepoint ){. 
2fa70 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20     int ii;      
2fa80 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
2fa90 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
2faa0 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20    int nNew;     
2fab0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2fac0 66 20 72 65 6d 61 69 6e 69 6e 67 20 73 61 76 65  f remaining save
2fad0 70 6f 69 6e 74 73 20 61 66 74 65 72 20 74 68 69  points after thi
2fae0 73 20 6f 70 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a  s op. */..    /*
2faf0 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
2fb00 6d 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20  many savepoints 
2fb10 77 69 6c 6c 20 73 74 69 6c 6c 20 62 65 20 61 63  will still be ac
2fb20 74 69 76 65 20 61 66 74 65 72 20 74 68 69 73 0a  tive after this.
2fb30 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e      ** operation
2fb40 2e 20 53 74 6f 72 65 20 74 68 69 73 20 76 61 6c  . Store this val
2fb50 75 65 20 69 6e 20 6e 4e 65 77 2e 20 54 68 65 6e  ue in nNew. Then
2fb60 20 66 72 65 65 20 72 65 73 6f 75 72 63 65 73 20   free resources 
2fb70 61 73 73 6f 63 69 61 74 65 64 20 0a 20 20 20 20  associated .    
2fb80 2a 2a 20 77 69 74 68 20 61 6e 79 20 73 61 76 65  ** with any save
2fb90 70 6f 69 6e 74 73 20 74 68 61 74 20 61 72 65 20  points that are 
2fba0 64 65 73 74 72 6f 79 65 64 20 62 79 20 74 68 69  destroyed by thi
2fbb0 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20  s operation..   
2fbc0 20 2a 2f 0a 20 20 20 20 6e 4e 65 77 20 3d 20 69   */.    nNew = i
2fbd0 53 61 76 65 70 6f 69 6e 74 20 2b 20 28 6f 70 3d  Savepoint + (op=
2fbe0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
2fbf0 41 43 4b 29 3b 0a 20 20 20 20 66 6f 72 28 69 69  ACK);.    for(ii
2fc00 3d 6e 4e 65 77 3b 20 69 69 3c 70 50 61 67 65 72  =nNew; ii<pPager
2fc10 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
2fc20 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
2fc30 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
2fc40 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
2fc50 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f  nt[ii].pInSavepo
2fc60 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  int);.    }.    
2fc70 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
2fc80 6e 74 20 3d 20 6e 4e 65 77 3b 0a 0a 20 20 20 20  nt = nNew;..    
2fc90 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
2fca0 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69  rollback operati
2fcb0 6f 6e 2c 20 70 6c 61 79 62 61 63 6b 20 74 68 65  on, playback the
2fcc0 20 73 70 65 63 69 66 69 65 64 20 73 61 76 65 70   specified savep
2fcd0 6f 69 6e 74 2e 0a 20 20 20 20 2a 2a 20 49 66 20  oint..    ** If 
2fce0 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 2d 66  this is a temp-f
2fcf0 69 6c 65 2c 20 69 74 20 69 73 20 70 6f 73 73 69  ile, it is possi
2fd00 62 6c 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ble that the jou
2fd10 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 0a 20 20  rnal file has.  
2fd20 20 20 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65    ** not yet bee
2fd30 6e 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69  n opened. In thi
2fd40 73 20 63 61 73 65 20 74 68 65 72 65 20 68 61 76  s case there hav
2fd50 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65  e been no change
2fd60 73 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  s to.    ** the 
2fd70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 73  database file, s
2fd80 6f 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 6f  o the playback o
2fd90 70 65 72 61 74 69 6f 6e 20 63 61 6e 20 62 65 20  peration can be 
2fda0 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a  skipped..    */.
2fdb0 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45      if( op==SAVE
2fdc0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 26  POINT_ROLLBACK &
2fdd0 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
2fde0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 50  >jfd) ){.      P
2fdf0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
2fe00 53 61 76 65 70 6f 69 6e 74 20 3d 20 28 6e 4e 65  Savepoint = (nNe
2fe10 77 3d 3d 30 29 3f 30 3a 26 70 50 61 67 65 72 2d  w==0)?0:&pPager-
2fe20 3e 61 53 61 76 65 70 6f 69 6e 74 5b 6e 4e 65 77  >aSavepoint[nNew
2fe30 2d 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  -1];.      rc = 
2fe40 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76  pagerPlaybackSav
2fe50 65 70 6f 69 6e 74 28 70 50 61 67 65 72 2c 20 70  epoint(pPager, p
2fe60 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
2fe70 20 20 61 73 73 65 72 74 28 72 63 21 3d 53 51 4c    assert(rc!=SQL
2fe80 49 54 45 5f 44 4f 4e 45 29 3b 0a 20 20 20 20 7d  ITE_DONE);.    }
2fe90 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
2fea0 69 73 20 69 73 20 61 20 72 65 6c 65 61 73 65 20  is is a release 
2feb0 6f 66 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74  of the outermost
2fec0 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 72 75 6e   savepoint, trun
2fed0 63 61 74 65 20 0a 20 20 20 20 2a 2a 20 74 68 65  cate .    ** the
2fee0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20   sub-journal to 
2fef0 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69  zero bytes in si
2ff00 7a 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  ze. */.    if( n
2ff10 4e 65 77 3d 3d 30 20 26 26 20 6f 70 3d 3d 53 41  New==0 && op==SA
2ff20 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
2ff30 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
2ff40 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  ->sjfd) ){.     
2ff50 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
2ff60 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
2ff70 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
2ff80 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73  uncate(pPager->s
2ff90 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  jfd, 0);.      p
2ffa0 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d  Pager->nSubRec =
2ffb0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
2ffc0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2ffd0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
2ffe0 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
2fff0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30000 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
30010 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69   *sqlite3PagerFi
30020 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  lename(Pager *pP
30030 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
30040 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
30050 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
30060 72 6e 20 74 68 65 20 56 46 53 20 73 74 72 75 63  rn the VFS struc
30070 74 75 72 65 20 66 6f 72 20 74 68 65 20 70 61 67  ture for the pag
30080 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c  er..*/.const sql
30090 69 74 65 33 5f 76 66 73 20 2a 73 71 6c 69 74 65  ite3_vfs *sqlite
300a0 33 50 61 67 65 72 56 66 73 28 50 61 67 65 72 20  3PagerVfs(Pager 
300b0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
300c0 72 6e 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b  rn pPager->pVfs;
300d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
300e0 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65   the file handle
300f0 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
30100 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65  e file associate
30110 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 70 61  d.** with the pa
30120 67 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74  ger.  This might
30130 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   return NULL if 
30140 74 68 65 20 66 69 6c 65 20 68 61 73 0a 2a 2a 20  the file has.** 
30150 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65  not yet been ope
30160 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  ned..*/.sqlite3_
30170 66 69 6c 65 20 2a 73 71 6c 69 74 65 33 50 61 67  file *sqlite3Pag
30180 65 72 46 69 6c 65 28 50 61 67 65 72 20 2a 70 50  erFile(Pager *pP
30190 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
301a0 70 50 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f  pPager->fd;.}../
301b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
301c0 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
301d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
301e0 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
301f0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f   *sqlite3PagerJo
30200 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20  urnalname(Pager 
30210 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
30220 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  rn pPager->zJour
30230 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nal;.}../*.** Re
30240 74 75 72 6e 20 74 72 75 65 20 69 66 20 66 73 79  turn true if fsy
30250 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64  nc() calls are d
30260 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73  isabled for this
30270 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20   pager.  Return 
30280 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e  FALSE.** if fsyn
30290 63 28 29 73 20 61 72 65 20 65 78 65 63 75 74 65  c()s are execute
302a0 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69  d normally..*/.i
302b0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e  nt sqlite3PagerN
302c0 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  osync(Pager *pPa
302d0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
302e0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d  Pager->noSync;.}
302f0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
30300 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20  HAS_CODEC./*.** 
30310 53 65 74 20 6f 72 20 72 65 74 72 69 65 76 65 20  Set or retrieve 
30320 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68  the codec for th
30330 69 73 20 70 61 67 65 72 0a 2a 2f 0a 73 74 61 74  is pager.*/.stat
30340 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 50  ic void sqlite3P
30350 61 67 65 72 53 65 74 43 6f 64 65 63 28 0a 20 20  agerSetCodec(.  
30360 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20  Pager *pPager,. 
30370 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29   void *(*xCodec)
30380 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
30390 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 28  o,int),.  void (
303a0 2a 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 29  *xCodecSizeChng)
303b0 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 2c  (void*,int,int),
303c0 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
303d0 46 72 65 65 29 28 76 6f 69 64 2a 29 2c 0a 20 20  Free)(void*),.  
303e0 76 6f 69 64 20 2a 70 43 6f 64 65 63 0a 29 7b 0a  void *pCodec.){.
303f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43    if( pPager->xC
30400 6f 64 65 63 46 72 65 65 20 29 20 70 50 61 67 65  odecFree ) pPage
30410 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50  r->xCodecFree(pP
30420 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 20  ager->pCodec);. 
30430 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20   pPager->xCodec 
30440 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67  = xCodec;.  pPag
30450 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68  er->xCodecSizeCh
30460 6e 67 20 3d 20 78 43 6f 64 65 63 53 69 7a 65 43  ng = xCodecSizeC
30470 68 6e 67 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78  hng;.  pPager->x
30480 43 6f 64 65 63 46 72 65 65 20 3d 20 78 43 6f 64  CodecFree = xCod
30490 65 63 46 72 65 65 3b 0a 20 20 70 50 61 67 65 72  ecFree;.  pPager
304a0 2d 3e 70 43 6f 64 65 63 20 3d 20 70 43 6f 64 65  ->pCodec = pCode
304b0 63 3b 0a 20 20 70 61 67 65 72 52 65 70 6f 72 74  c;.  pagerReport
304c0 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a  Size(pPager);.}.
304d0 73 74 61 74 69 63 20 76 6f 69 64 20 2a 73 71 6c  static void *sql
304e0 69 74 65 33 50 61 67 65 72 47 65 74 43 6f 64 65  ite3PagerGetCode
304f0 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  c(Pager *pPager)
30500 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
30510 72 2d 3e 70 43 6f 64 65 63 3b 0a 7d 0a 23 65 6e  r->pCodec;.}.#en
30520 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
30530 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
30540 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  UUM./*.** Move t
30550 68 65 20 70 61 67 65 20 70 50 67 20 74 6f 20 6c  he page pPg to l
30560 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20  ocation pgno in 
30570 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
30580 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f  There must be no
30590 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
305a0 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73  he page previous
305b0 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a 2a  ly located at.**
305c0 20 70 67 6e 6f 20 28 77 68 69 63 68 20 77 65 20   pgno (which we 
305d0 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68 6f  call pPgOld) tho
305e0 75 67 68 20 74 68 61 74 20 70 61 67 65 20 69 73  ugh that page is
305f0 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a 2a   allowed to be.*
30600 2a 20 69 6e 20 63 61 63 68 65 2e 20 20 49 66 20  * in cache.  If 
30610 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75  the page previou
30620 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 20 70  sly located at p
30630 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  gno is not alrea
30640 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c  dy.** in the rol
30650 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69  lback journal, i
30660 74 20 69 73 20 6e 6f 74 20 70 75 74 20 74 68 65  t is not put the
30670 72 65 20 62 79 20 62 79 20 74 68 69 73 20 72 6f  re by by this ro
30680 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66  utine..**.** Ref
30690 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
306a0 61 67 65 20 70 50 67 20 72 65 6d 61 69 6e 20 76  age pPg remain v
306b0 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61  alid. Updating a
306c0 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20  ny.** meta-data 
306d0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
306e0 70 50 67 20 28 69 2e 65 2e 20 64 61 74 61 20 73  pPg (i.e. data s
306f0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78  tored in the nEx
30700 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c  tra bytes.** all
30710 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
30720 68 20 74 68 65 20 70 61 67 65 29 20 69 73 20 74  h the page) is t
30730 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
30740 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e  y of the caller.
30750 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63  .**.** A transac
30760 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74  tion must be act
30770 69 76 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ive when this ro
30780 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
30790 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a   It used to be.*
307a0 2a 20 72 65 71 75 69 72 65 64 20 74 68 61 74 20  * required that 
307b0 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
307c0 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20  saction was not 
307d0 61 63 74 69 76 65 2c 20 62 75 74 20 74 68 69 73  active, but this
307e0 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20   restriction.** 
307f0 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64  has been removed
30800 20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e   (CREATE INDEX n
30810 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70  eeds to move a p
30820 61 67 65 20 77 68 65 6e 20 61 20 73 74 61 74 65  age when a state
30830 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ment.** transact
30840 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a  ion is active)..
30850 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 75  **.** If the fou
30860 72 74 68 20 61 72 67 75 6d 65 6e 74 2c 20 69 73  rth argument, is
30870 43 6f 6d 6d 69 74 2c 20 69 73 20 6e 6f 6e 2d 7a  Commit, is non-z
30880 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 70  ero, then this p
30890 61 67 65 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20  age is being.** 
308a0 6d 6f 76 65 64 20 61 73 20 70 61 72 74 20 6f 66  moved as part of
308b0 20 61 20 64 61 74 61 62 61 73 65 20 72 65 6f 72   a database reor
308c0 67 61 6e 69 7a 61 74 69 6f 6e 20 6a 75 73 74 20  ganization just 
308d0 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
308e0 61 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 62 65  action .** is be
308f0 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49  ing committed. I
30900 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69 74 20  n this case, it 
30910 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
30920 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
30930 70 61 67 65 20 0a 2a 2a 20 70 50 67 20 72 65 66  page .** pPg ref
30940 65 72 73 20 74 6f 20 77 69 6c 6c 20 6e 6f 74 20  ers to will not 
30950 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 61 67  be written to ag
30960 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20  ain within this 
30970 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
30980 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
30990 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
309a0 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49  TE_NOMEM or an I
309b0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  O error code if 
309c0 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75  an error.** occu
309d0 72 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  rs. Otherwise, i
309e0 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
309f0 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
30a00 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
30a10 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
30a20 44 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e  DbPage *pPg, Pgn
30a30 6f 20 70 67 6e 6f 2c 20 69 6e 74 20 69 73 43 6f  o pgno, int isCo
30a40 6d 6d 69 74 29 7b 0a 20 20 50 67 48 64 72 20 2a  mmit){.  PgHdr *
30a50 70 50 67 4f 6c 64 3b 20 20 20 20 20 20 20 20 20  pPgOld;         
30a60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
30a70 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74  e being overwrit
30a80 74 65 6e 2e 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  ten. */.  Pgno n
30a90 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b  eedSyncPgno = 0;
30aa0 20 20 20 20 20 20 20 2f 2a 20 4f 6c 64 20 76 61         /* Old va
30ab0 6c 75 65 20 6f 66 20 70 50 67 2d 3e 70 67 6e 6f  lue of pPg->pgno
30ac0 2c 20 69 66 20 73 79 6e 63 20 69 73 20 72 65 71  , if sync is req
30ad0 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72  uired */.  int r
30ae0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
30af0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
30b00 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f  n code */.  Pgno
30b10 20 6f 72 69 67 50 67 6e 6f 3b 20 20 20 20 20 20   origPgno;      
30b20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
30b30 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 6e 75  original page nu
30b40 6d 62 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  mber */..  asser
30b50 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
30b60 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
30b70 61 67 65 20 62 65 69 6e 67 20 6d 6f 76 65 64 20  age being moved 
30b80 69 73 20 64 69 72 74 79 20 61 6e 64 20 68 61 73  is dirty and has
30b90 20 6e 6f 74 20 62 65 65 6e 20 73 61 76 65 64 20   not been saved 
30ba0 62 79 20 74 68 65 20 6c 61 74 65 73 74 0a 20 20  by the latest.  
30bb0 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 68  ** savepoint, th
30bc0 65 6e 20 73 61 76 65 20 74 68 65 20 63 75 72 72  en save the curr
30bd0 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ent contents of 
30be0 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68  the page into th
30bf0 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72  e .  ** sub-jour
30c00 6e 61 6c 20 6e 6f 77 2e 20 54 68 69 73 20 69 73  nal now. This is
30c10 20 72 65 71 75 69 72 65 64 20 74 6f 20 68 61 6e   required to han
30c20 64 6c 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  dle the followin
30c30 67 20 73 63 65 6e 61 72 69 6f 3a 0a 20 20 2a 2a  g scenario:.  **
30c40 0a 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20  .  **   BEGIN;. 
30c50 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c   **     <journal
30c60 20 70 61 67 65 20 58 2c 20 74 68 65 6e 20 6d 6f   page X, then mo
30c70 64 69 66 79 20 69 74 20 69 6e 20 6d 65 6d 6f 72  dify it in memor
30c80 79 3e 0a 20 20 2a 2a 20 20 20 20 20 53 41 56 45  y>.  **     SAVE
30c90 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 2a 2a 20  POINT one;.  ** 
30ca0 20 20 20 20 20 20 3c 4d 6f 76 65 20 70 61 67 65        <Move page
30cb0 20 58 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 59   X to location Y
30cc0 3e 0a 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42  >.  **     ROLLB
30cd0 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 2a 2a  ACK TO one;.  **
30ce0 0a 20 20 2a 2a 20 49 66 20 70 61 67 65 20 58 20  .  ** If page X 
30cf0 77 65 72 65 20 6e 6f 74 20 77 72 69 74 74 65 6e  were not written
30d00 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
30d10 6e 61 6c 20 68 65 72 65 2c 20 69 74 20 77 6f 75  nal here, it wou
30d20 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 70  ld not.  ** be p
30d30 6f 73 73 69 62 6c 65 20 74 6f 20 72 65 73 74 6f  ossible to resto
30d40 72 65 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 20  re its contents 
30d50 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41  when the "ROLLBA
30d60 43 4b 20 54 4f 20 6f 6e 65 22 0a 20 20 2a 2a 20  CK TO one".  ** 
30d70 73 74 61 74 65 6d 65 6e 74 20 77 65 72 65 20 69  statement were i
30d80 73 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a  s processed..  *
30d90 2a 0a 20 20 2a 2a 20 73 75 62 6a 6f 75 72 6e 61  *.  ** subjourna
30da0 6c 50 61 67 65 28 29 20 6d 61 79 20 6e 65 65 64  lPage() may need
30db0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61   to allocate spa
30dc0 63 65 20 74 6f 20 73 74 6f 72 65 20 70 50 67 2d  ce to store pPg-
30dd0 3e 70 67 6e 6f 20 69 6e 74 6f 0a 20 20 2a 2a 20  >pgno into.  ** 
30de0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65  one or more save
30df0 70 6f 69 6e 74 20 62 69 74 76 65 63 73 2e 20 54  point bitvecs. T
30e00 68 69 73 20 69 73 20 74 68 65 20 72 65 61 73 6f  his is the reaso
30e10 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  n this function.
30e20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20    ** may return 
30e30 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 20 20  SQLITE_NOMEM..  
30e40 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c  */.  if( pPg->fl
30e50 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20  ags&PGHDR_DIRTY 
30e60 0a 20 20 20 26 26 20 73 75 62 6a 52 65 71 75 69  .   && subjRequi
30e70 72 65 73 50 61 67 65 28 70 50 67 29 0a 20 20 20  resPage(pPg).   
30e80 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  && SQLITE_OK!=(r
30e90 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  c = subjournalPa
30ea0 67 65 28 70 50 67 29 29 0a 20 20 29 7b 0a 20 20  ge(pPg)).  ){.  
30eb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
30ec0 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
30ed0 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25 64  "MOVE %d page %d
30ee0 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20 6d   (needSync=%d) m
30ef0 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a  oves to %d\n", .
30f00 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
30f10 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
30f20 2c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  , (pPg->flags&PG
30f30 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31  HDR_NEED_SYNC)?1
30f40 3a 30 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 49 4f  :0, pgno));.  IO
30f50 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25 70 20  TRACE(("MOVE %p 
30f60 25 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %d %d\n", pPager
30f70 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e  , pPg->pgno, pgn
30f80 6f 29 29 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  o))..  /* If the
30f90 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74   journal needs t
30fa0 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65  o be sync()ed be
30fb0 66 6f 72 65 20 70 61 67 65 20 70 50 67 2d 3e 70  fore page pPg->p
30fc0 67 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20 62 65 20  gno can.  ** be 
30fd0 77 72 69 74 74 65 6e 20 74 6f 2c 20 73 74 6f 72  written to, stor
30fe0 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 6c  e pPg->pgno in l
30ff0 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 65  ocal variable ne
31000 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 2a 2a  edSyncPgno..  **
31010 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 69 73 43  .  ** If the isC
31020 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65  ommit flag is se
31030 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  t, there is no n
31040 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20  eed to remember 
31050 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  that.  ** the jo
31060 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62  urnal needs to b
31070 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  e sync()ed befor
31080 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
31090 70 50 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a 2a 20  pPg->pgno .  ** 
310a0 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74  can be written t
310b0 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61  o. The caller ha
310c0 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73  s already promis
310d0 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20  ed not to write 
310e0 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  to it..  */.  if
310f0 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  ( (pPg->flags&PG
31100 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 20 26  HDR_NEED_SYNC) &
31110 26 20 21 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20  & !isCommit ){. 
31120 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20     needSyncPgno 
31130 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20  = pPg->pgno;.   
31140 20 61 73 73 65 72 74 28 20 70 61 67 65 49 6e 4a   assert( pageInJ
31150 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70  ournal(pPg) || p
31160 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
31170 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20  >dbOrigSize );. 
31180 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
31190 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
311a0 59 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Y );.    assert(
311b0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
311c0 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  c );.  }..  /* I
311d0 66 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74  f the cache cont
311e0 61 69 6e 73 20 61 20 70 61 67 65 20 77 69 74 68  ains a page with
311f0 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e   page-number pgn
31200 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a  o, remove it.  *
31210 2a 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20  * from its hash 
31220 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20  chain. Also, if 
31230 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
31240 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a  nc was set for .
31250 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62    ** page pgno b
31260 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27  efore the 'move'
31270 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e   operation, it n
31280 65 65 64 73 20 74 6f 20 62 65 20 72 65 74 61 69  eeds to be retai
31290 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68  ned .  ** for th
312a0 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65  e page moved the
312b0 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e  re..  */.  pPg->
312c0 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f  flags &= ~PGHDR_
312d0 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 70 50 67  NEED_SYNC;.  pPg
312e0 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  Old = pager_look
312f0 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
31300 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67  ;.  assert( !pPg
31310 4f 6c 64 20 7c 7c 20 70 50 67 4f 6c 64 2d 3e 6e  Old || pPgOld->n
31320 52 65 66 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  Ref==1 );.  if( 
31330 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 70 50  pPgOld ){.    pP
31340 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70 50 67  g->flags |= (pPg
31350 4f 6c 64 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  Old->flags&PGHDR
31360 5f 4e 45 45 44 5f 53 59 4e 43 29 3b 0a 20 20 20  _NEED_SYNC);.   
31370 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
31380 6f 70 28 70 50 67 4f 6c 64 29 3b 0a 20 20 7d 0a  op(pPgOld);.  }.
31390 0a 20 20 6f 72 69 67 50 67 6e 6f 20 3d 20 70 50  .  origPgno = pP
313a0 67 2d 3e 70 67 6e 6f 3b 0a 20 20 73 71 6c 69 74  g->pgno;.  sqlit
313b0 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67  e3PcacheMove(pPg
313c0 2c 20 70 67 6e 6f 29 3b 0a 20 20 73 71 6c 69 74  , pgno);.  sqlit
313d0 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
313e0 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72  y(pPg);.  pPager
313f0 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31  ->dbModified = 1
31400 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e  ;..  if( needSyn
31410 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20  cPgno ){.    /* 
31420 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20  If needSyncPgno 
31430 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
31440 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
31450 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a  le needs to be .
31460 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20      ** sync()ed 
31470 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20  before any data 
31480 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61  is written to da
31490 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65  tabase file page
314a0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20   needSyncPgno.. 
314b0 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c     ** Currently,
314c0 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78   no such page ex
314d0 69 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65  ists in the page
314e0 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a  -cache and the .
314f0 20 20 20 20 2a 2a 20 22 69 73 20 6a 6f 75 72 6e      ** "is journ
31500 61 6c 65 64 22 20 62 69 74 76 65 63 20 66 6c 61  aled" bitvec fla
31510 67 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  g has been set. 
31520 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65  This needs to be
31530 20 72 65 6d 65 64 69 65 64 20 62 79 0a 20 20 20   remedied by.   
31540 20 2a 2a 20 6c 6f 61 64 69 6e 67 20 74 68 65 20   ** loading the 
31550 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61  page into the pa
31560 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65  ger-cache and se
31570 74 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e  tting the PgHdr.
31580 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a  needSync .    **
31590 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20   flag..    **.  
315a0 20 20 2a 2a 20 49 66 20 74 68 65 20 61 74 74 65    ** If the atte
315b0 6d 70 74 20 74 6f 20 6c 6f 61 64 20 74 68 65 20  mpt to load the 
315c0 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61  page into the pa
315d0 67 65 2d 63 61 63 68 65 20 66 61 69 6c 73 2c 20  ge-cache fails, 
315e0 28 64 75 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61  (due.    ** to a
315f0 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
31600 66 61 69 6c 75 72 65 29 2c 20 63 6c 65 61 72 20  failure), clear 
31610 74 68 65 20 62 69 74 20 69 6e 20 74 68 65 20 70  the bit in the p
31620 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20  InJournal[].    
31630 2a 2a 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77  ** array. Otherw
31640 69 73 65 2c 20 69 66 20 74 68 65 20 70 61 67 65  ise, if the page
31650 20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 77   is loaded and w
31660 72 69 74 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a  ritten again in.
31670 20 20 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e      ** this tran
31680 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20  saction, it may 
31690 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
316a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
316b0 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74  before.    ** it
316c0 20 69 73 20 73 79 6e 63 65 64 20 69 6e 74 6f 20   is synced into 
316d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
316e0 2e 20 54 68 69 73 20 77 61 79 2c 20 69 74 20 6d  . This way, it m
316f0 61 79 20 65 6e 64 20 75 70 20 69 6e 0a 20 20 20  ay end up in.   
31700 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
31710 66 69 6c 65 20 74 77 69 63 65 2c 20 62 75 74 20  file twice, but 
31720 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 72  that is not a pr
31730 6f 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20  oblem..    **.  
31740 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33    ** The sqlite3
31750 50 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20  PagerGet() call 
31760 6d 61 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f  may cause the jo
31770 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53  urnal to sync. S
31780 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75  o make.    ** su
31790 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65  re the Pager.nee
317a0 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65  dSync flag is se
317b0 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20  t too..    */.  
317c0 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
317d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
317e0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b  ger->needSync );
317f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
31800 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
31810 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20  , needSyncPgno, 
31820 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66  &pPgHdr);.    if
31830 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31840 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
31850 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
31860 26 26 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 3c  && needSyncPgno<
31870 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
31880 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ize ){.        a
31890 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
318a0 54 6d 70 53 70 61 63 65 21 3d 30 20 29 3b 0a 20  TmpSpace!=0 );. 
318b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69         sqlite3Bi
318c0 74 76 65 63 43 6c 65 61 72 28 70 50 61 67 65 72  tvecClear(pPager
318d0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65  ->pInJournal, ne
318e0 65 64 53 79 6e 63 50 67 6e 6f 2c 20 70 50 61 67  edSyncPgno, pPag
318f0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  er->pTmpSpace);.
31900 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
31910 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
31920 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
31930 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 61 73 73  ync = 1;.    ass
31940 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ert( pPager->noS
31950 79 6e 63 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42  ync==0 && !MEMDB
31960 20 29 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e   );.    pPgHdr->
31970 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
31980 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 73 71  EED_SYNC;.    sq
31990 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
319a0 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20  irty(pPgHdr);.  
319b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
319c0 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d  ref(pPgHdr);.  }
319d0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 6f 72 20  ..  /*.  ** For 
319e0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
319f0 61 62 61 73 65 2c 20 6d 61 6b 65 20 73 75 72 65  abase, make sure
31a00 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
31a10 67 65 20 63 6f 6e 74 69 6e 75 65 73 0a 20 20 2a  ge continues.  *
31a20 2a 20 74 6f 20 65 78 69 73 74 2c 20 69 6e 20 63  * to exist, in c
31a30 61 73 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ase the transact
31a40 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 72 6f 6c  ion needs to rol
31a50 6c 20 62 61 63 6b 2e 20 20 57 65 20 61 6c 6c 6f  l back.  We allo
31a60 63 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 70 61  cate.  ** the pa
31a70 67 65 20 6e 6f 77 2c 20 69 6e 73 74 65 61 64 20  ge now, instead 
31a80 6f 66 20 61 74 20 72 6f 6c 6c 62 61 63 6b 2c 20  of at rollback, 
31a90 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 20 62  because we can b
31aa0 65 74 74 65 72 20 64 65 61 6c 0a 20 20 2a 2a 20  etter deal.  ** 
31ab0 77 69 74 68 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d  with an out-of-m
31ac0 65 6d 6f 72 79 20 65 72 72 6f 72 20 6e 6f 77 2e  emory error now.
31ad0 20 20 54 69 63 6b 65 74 20 23 33 37 36 31 2e 0a    Ticket #3761..
31ae0 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42    */.  if( MEMDB
31af0 20 29 7b 0a 20 20 20 20 44 62 50 61 67 65 20 2a   ){.    DbPage *
31b00 70 4e 65 77 3b 0a 20 20 20 20 72 63 20 3d 20 73  pNew;.    rc = s
31b10 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
31b20 72 65 28 70 50 61 67 65 72 2c 20 6f 72 69 67 50  re(pPager, origP
31b30 67 6e 6f 2c 20 26 70 4e 65 77 2c 20 31 29 3b 0a  gno, &pNew, 1);.
31b40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31b50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
31b60 71 6c 69 74 65 33 50 63 61 63 68 65 4d 6f 76 65  qlite3PcacheMove
31b70 28 70 50 67 2c 20 6f 72 69 67 50 67 6e 6f 29 3b  (pPg, origPgno);
31b80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
31b90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
31ba0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4e  te3PagerUnref(pN
31bb0 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ew);.  }..  retu
31bc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
31bd0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
31be0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
31bf0 6f 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  o the data for t
31c00 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
31c10 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  e..*/.void *sqli
31c20 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
31c30 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
31c40 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
31c50 66 3e 30 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67  f>0 || pPg->pPag
31c60 65 72 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20 20 72  er->memDb );.  r
31c70 65 74 75 72 6e 20 70 50 67 2d 3e 70 44 61 74 61  eturn pPg->pData
31c80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
31c90 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
31ca0 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20  he Pager.nExtra 
31cb0 62 79 74 65 73 20 6f 66 20 22 65 78 74 72 61 22  bytes of "extra"
31cc0 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63   space .** alloc
31cd0 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  ated along with 
31ce0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
31cf0 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ge..*/.void *sql
31d00 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
31d10 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  a(DbPage *pPg){.
31d20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
31d30 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
31d40 20 72 65 74 75 72 6e 20 28 70 50 61 67 65 72 3f   return (pPager?
31d50 70 50 67 2d 3e 70 45 78 74 72 61 3a 30 29 3b 0a  pPg->pExtra:0);.
31d60 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74  }../*.** Get/set
31d70 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64   the locking-mod
31d80 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
31d90 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64  . Parameter eMod
31da0 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a  e must be one.**
31db0 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e   of PAGER_LOCKIN
31dc0 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41 47  GMODE_QUERY, PAG
31dd0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
31de0 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47  ORMAL or .** PAG
31df0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
31e00 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68 65  XCLUSIVE. If the
31e10 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
31e20 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a  t _QUERY, then.*
31e30 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  * the locking-mo
31e40 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  de is set to the
31e50 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64   value specified
31e60 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
31e70 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65 69  rned value is ei
31e80 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ther PAGER_LOCKI
31e90 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72  NGMODE_NORMAL or
31ea0 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  .** PAGER_LOCKIN
31eb0 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2c  GMODE_EXCLUSIVE,
31ec0 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20   indicating the 
31ed0 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c  current (possibl
31ee0 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f  y updated).** lo
31ef0 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69  cking-mode..*/.i
31f00 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nt sqlite3PagerL
31f10 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65 72  ockingMode(Pager
31f20 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d   *pPager, int eM
31f30 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ode){.  assert( 
31f40 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
31f50 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20  KINGMODE_QUERY. 
31f60 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
31f70 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
31f80 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20  NGMODE_NORMAL.  
31f90 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
31fa0 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
31fb0 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
31fc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
31fd0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51  ER_LOCKINGMODE_Q
31fe0 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73 65  UERY<0 );.  asse
31ff0 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
32000 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20  GMODE_NORMAL>=0 
32010 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  && PAGER_LOCKING
32020 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d  MODE_EXCLUSIVE>=
32030 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65  0 );.  if( eMode
32040 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e  >=0 && !pPager->
32050 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
32060 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
32070 65 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64  eMode = (u8)eMod
32080 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
32090 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78 63  (int)pPager->exc
320a0 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f  lusiveMode;.}../
320b0 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65  *.** Get/set the
320c0 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 66 6f   journal-mode fo
320d0 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61  r this pager. Pa
320e0 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75  rameter eMode mu
320f0 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a 0a 2a 2a  st be one of:.**
32100 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55  .**    PAGER_JOU
32110 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 2a  RNALMODE_QUERY.*
32120 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e  *    PAGER_JOURN
32130 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 2a 2a  ALMODE_DELETE.**
32140 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41      PAGER_JOURNA
32150 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 2a  LMODE_TRUNCATE.*
32160 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e  *    PAGER_JOURN
32170 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 2a  ALMODE_PERSIST.*
32180 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e  *    PAGER_JOURN
32190 41 4c 4d 4f 44 45 5f 4f 46 46 0a 2a 2a 20 20 20  ALMODE_OFF.**   
321a0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
321b0 44 45 5f 4d 45 4d 4f 52 59 0a 2a 2a 0a 2a 2a 20  DE_MEMORY.**.** 
321c0 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  If the parameter
321d0 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20   is not _QUERY, 
321e0 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
321f0 5f 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20  _mode is set to 
32200 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 73 70 65  the.** value spe
32210 63 69 66 69 65 64 20 69 66 20 74 68 65 20 63 68  cified if the ch
32220 61 6e 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 2e  ange is allowed.
32230 20 20 54 68 65 20 63 68 61 6e 67 65 20 69 73 20    The change is 
32240 64 69 73 61 6c 6c 6f 77 65 64 0a 2a 2a 20 66 6f  disallowed.** fo
32250 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  r the following 
32260 72 65 61 73 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20  reasons:.**.**  
32270 20 2a 20 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79   *  An in-memory
32280 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 6f 6e   database can on
32290 6c 79 20 68 61 76 65 20 69 74 73 20 6a 6f 75 72  ly have its jour
322a0 6e 61 6c 5f 6d 6f 64 65 20 73 65 74 20 74 6f 20  nal_mode set to 
322b0 5f 4f 46 46 0a 2a 2a 20 20 20 20 20 20 6f 72 20  _OFF.**      or 
322c0 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 20  _MEMORY..**.**  
322d0 20 2a 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   *  The journal 
322e0 6d 6f 64 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  mode may not be 
322f0 63 68 61 6e 67 65 64 20 77 68 69 6c 65 20 61 20  changed while a 
32300 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
32310 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ctive..**.** The
32320 20 72 65 74 75 72 6e 65 64 20 69 6e 64 69 63 61   returned indica
32330 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 28  te the current (
32340 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64  possibly updated
32350 29 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a  ) journal-mode..
32360 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
32370 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50  gerJournalMode(P
32380 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
32390 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65  t eMode){.  asse
323a0 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52  rt( eMode==PAGER
323b0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45  _JOURNALMODE_QUE
323c0 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  RY.            |
323d0 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
323e0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
323f0 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  E.            ||
32400 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
32410 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
32420 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  TE.            |
32430 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
32440 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
32450 53 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  ST.            |
32460 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
32470 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
32480 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
32490 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
324a0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
324b0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
324c0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55  R_JOURNALMODE_QU
324d0 45 52 59 3c 30 20 29 3b 0a 20 20 69 66 28 20 65  ERY<0 );.  if( e
324e0 4d 6f 64 65 3e 3d 30 0a 20 20 20 26 26 20 28 21  Mode>=0.   && (!
324f0 4d 45 4d 44 42 20 7c 7c 20 65 4d 6f 64 65 3d 3d  MEMDB || eMode==
32500 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
32510 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20  E_MEMORY .      
32520 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
32530 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
32540 4f 44 45 5f 4f 46 46 29 0a 20 20 20 26 26 20 21  ODE_OFF).   && !
32550 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
32560 65 64 0a 20 20 20 26 26 20 28 21 69 73 4f 70 65  ed.   && (!isOpe
32570 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
32580 7c 20 30 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  | 0==pPager->jou
32590 72 6e 61 6c 4f 66 66 29 0a 20 20 29 7b 0a 20 20  rnalOff).  ){.  
325a0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
325b0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
325c0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
325d0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
325e0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
325f0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
32600 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20  (u8)eMode;.  }. 
32610 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61   return (int)pPa
32620 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
32630 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73  ;.}../*.** Get/s
32640 65 74 20 74 68 65 20 73 69 7a 65 2d 6c 69 6d 69  et the size-limi
32650 74 20 75 73 65 64 20 66 6f 72 20 70 65 72 73 69  t used for persi
32660 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69  stent journal fi
32670 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 74 74 69  les..**.** Setti
32680 6e 67 20 74 68 65 20 73 69 7a 65 20 6c 69 6d 69  ng the size limi
32690 74 20 74 6f 20 2d 31 20 6d 65 61 6e 73 20 6e 6f  t to -1 means no
326a0 20 6c 69 6d 69 74 20 69 73 20 65 6e 66 6f 72 63   limit is enforc
326b0 65 64 2e 0a 2a 2a 20 41 6e 20 61 74 74 65 6d 70  ed..** An attemp
326c0 74 20 74 6f 20 73 65 74 20 61 20 6c 69 6d 69 74  t to set a limit
326d0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 2d 31   smaller than -1
326e0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
326f0 69 36 34 20 73 71 6c 69 74 65 33 50 61 67 65 72  i64 sqlite3Pager
32700 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  JournalSizeLimit
32710 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
32720 69 36 34 20 69 4c 69 6d 69 74 29 7b 0a 20 20 69  i64 iLimit){.  i
32730 66 28 20 69 4c 69 6d 69 74 3e 3d 2d 31 20 29 7b  f( iLimit>=-1 ){
32740 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
32750 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20  rnalSizeLimit = 
32760 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65  iLimit;.  }.  re
32770 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75  turn pPager->jou
32780 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a 7d  rnalSizeLimit;.}
32790 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
327a0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
327b0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
327c0 76 61 72 69 61 62 6c 65 2e 20 54 68 65 20 62 61  variable. The ba
327d0 63 6b 75 70 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69  ckup module.** i
327e0 6e 20 62 61 63 6b 75 70 2e 63 20 6d 61 69 6e 74  n backup.c maint
327f0 61 69 6e 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  ains the content
32800 20 6f 66 20 74 68 69 73 20 76 61 72 69 61 62 6c   of this variabl
32810 65 2e 20 54 68 69 73 20 6d 6f 64 75 6c 65 0a 2a  e. This module.*
32820 2a 20 75 73 65 73 20 69 74 20 6f 70 61 71 75 65  * uses it opaque
32830 6c 79 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ly as an argumen
32840 74 20 74 6f 20 73 71 6c 69 74 65 33 42 61 63 6b  t to sqlite3Back
32850 75 70 52 65 73 74 61 72 74 28 29 20 61 6e 64 0a  upRestart() and.
32860 2a 2a 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70  ** sqlite3Backup
32870 55 70 64 61 74 65 28 29 20 6f 6e 6c 79 2e 0a 2a  Update() only..*
32880 2f 0a 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  /.sqlite3_backup
32890 20 2a 2a 73 71 6c 69 74 65 33 50 61 67 65 72 42   **sqlite3PagerB
328a0 61 63 6b 75 70 50 74 72 28 50 61 67 65 72 20 2a  ackupPtr(Pager *
328b0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
328c0 6e 20 26 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  n &pPager->pBack
328d0 75 70 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  up;.}..#endif /*
328e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
328f0 4b 49 4f 20 2a 2f 0a                             KIO */.