/ Hex Artifact Content
Login

Artifact 872b3807172f24d46413d9b765b9af6020da443a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 36 31  : pager.c,v 1.61
0350: 38 20 32 30 30 39 2f 30 37 2f 32 35 20 30 30 3a  8 2009/07/25 00:
0360: 31 30 3a 34 36 20 64 72 68 20 45 78 70 20 24 0a  10:46 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72  t.h"../*.** Macr
03b0: 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68  os for troublesh
03c0: 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61 6c 6c  ooting.  Normall
03d0: 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a  y turned off.*/.
03e0: 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69 74 65  #if 0.int sqlite
03f0: 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b 20 20  3PagerTrace=1;  
0400: 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61 62 6c  /* True to enabl
0410: 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 64 65  e tracing */.#de
0420: 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65 62 75  fine sqlite3Debu
0430: 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66 0a 23  gPrintf printf.#
0440: 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43  define PAGERTRAC
0450: 45 28 58 29 20 20 20 20 20 69 66 28 20 73 71 6c  E(X)     if( sql
0460: 69 74 65 33 50 61 67 65 72 54 72 61 63 65 20 29  ite3PagerTrace )
0470: 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72  { sqlite3DebugPr
0480: 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73 65 0a  intf X; }.#else.
0490: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
04a0: 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  CE(X).#endif../*
04b0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
04c0: 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61 72 65  g two macros are
04d0: 20 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65   used within the
04e0: 20 50 41 47 45 52 54 52 41 43 45 28 29 20 6d 61   PAGERTRACE() ma
04f0: 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f  cros above.** to
0500: 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d   print out file-
0510: 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a  descriptors. .**
0520: 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20 74 61  .** PAGERID() ta
0530: 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  kes a pointer to
0540: 20 61 20 50 61 67 65 72 20 73 74 72 75 63 74 20   a Pager struct 
0550: 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74 2e  as its argument.
0560: 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74   The.** associat
0570: 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ed file-descript
0580: 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  or is returned. 
0590: 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29 20 74  FILEHANDLEID() t
05a0: 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65 33 5f  akes an sqlite3_
05b0: 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 20 61  file.** struct a
05c0: 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74 2e 0a  s its argument..
05d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
05e0: 49 44 28 70 29 20 28 28 69 6e 74 29 28 70 2d 3e  ID(p) ((int)(p->
05f0: 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46 49 4c  fd)).#define FIL
0600: 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28 28  EHANDLEID(fd) ((
0610: 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54  int)fd)../*.** T
0620: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73  he page cache as
0630: 20 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61   a whole is alwa
0640: 79 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  ys in one of the
0650: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74   following.** st
0660: 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41  ates:.**.**   PA
0670: 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20  GER_UNLOCK      
0680: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
0690: 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
06a0: 79 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a  y reading or .**
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06c0: 20 20 20 20 20 20 20 77 72 69 74 69 6e 67 20 74         writing t
06d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
06e0: 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a  .  There is no.*
06f0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0700: 20 20 20 20 20 20 20 20 64 61 74 61 20 68 65 6c          data hel
0710: 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68  d in memory.  Th
0720: 69 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  is is the initia
0730: 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
0740: 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65             state
0750: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0760: 53 48 41 52 45 44 20 20 20 20 20 20 20 20 54 68  SHARED        Th
0770: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0780: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0790: 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  base..**        
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
07b0: 72 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65  riting is not pe
07c0: 72 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20  rmitted.  There 
07d0: 63 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20  can be.**       
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73  multiple readers
0800: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73   accessing the s
0810: 61 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ame database.** 
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68        file at th
0840: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a  e same time..**.
0850: 2a 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52  **   PAGER_RESER
0860: 56 45 44 20 20 20 20 20 20 54 68 69 73 20 70 72  VED      This pr
0870: 6f 63 65 73 73 20 68 61 73 20 72 65 73 65 72 76  ocess has reserv
0880: 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
0890: 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20  for writing.**  
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 20 20 20 62 75 74 20 68 61 73 20 6e 6f 74       but has not
08c0: 20 79 65 74 20 6d 61 64 65 20 61 6e 79 20 63 68   yet made any ch
08d0: 61 6e 67 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65  anges.  Only one
08e0: 20 70 72 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20   process.**     
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 61 74 20 61 20 74 69 6d 65 20 63 61 6e 20    at a time can 
0910: 72 65 73 65 72 76 65 20 74 68 65 20 64 61 74 61  reserve the data
0920: 62 61 73 65 2e 20 20 54 68 65 20 6f 72 69 67 69  base.  The origi
0930: 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  nal.**          
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0950: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e  abase file has n
0960: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
0970: 20 73 6f 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20   so other.**    
0980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0990: 20 20 20 70 72 6f 63 65 73 73 65 73 20 6d 61 79     processes may
09a0: 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e   still be readin
09b0: 67 20 74 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a  g the on-disk.**
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09d0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
09e0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  file..**.**   PA
09f0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20  GER_EXCLUSIVE   
0a00: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
0a10: 20 69 73 20 77 72 69 74 69 6e 67 20 74 68 65 20   is writing the 
0a20: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20  database..**    
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a40: 20 20 20 41 63 63 65 73 73 20 69 73 20 65 78 63     Access is exc
0a50: 6c 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65  lusive.  No othe
0a60: 72 20 70 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a  r processes or.*
0a70: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0a80: 20 20 20 20 20 20 20 20 74 68 72 65 61 64 73 20          threads 
0a90: 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 6f  can be reading o
0aa0: 72 20 77 72 69 74 69 6e 67 20 77 68 69 6c 65 20  r writing while 
0ab0: 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  one.**          
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f               pro
0ad0: 63 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 2e  cess is writing.
0ae0: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53  .**.**   PAGER_S
0af0: 59 4e 43 45 44 20 20 20 20 20 20 20 20 54 68 65  YNCED        The
0b00: 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20   pager moves to 
0b10: 74 68 69 73 20 73 74 61 74 65 20 66 72 6f 6d 20  this state from 
0b20: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 0a  PAGER_EXCLUSIVE.
0b30: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0b40: 20 20 20 20 20 20 20 20 20 61 66 74 65 72 20 61           after a
0b50: 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 68  ll dirty pages h
0b60: 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
0b70: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
0ba0: 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  nd the file has 
0bb0: 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a  been synced to.*
0bc0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0bd0: 20 20 20 20 20 20 20 20 64 69 73 6b 2e 20 41 6c          disk. Al
0be0: 6c 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74  l that remains t
0bf0: 6f 20 64 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76  o do is to remov
0c00: 65 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  e or.**         
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
0c20: 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
0c30: 61 6c 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  al file and the 
0c40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c60: 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20 63 6f        will be co
0c70: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  mmitted..**.** T
0c80: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 63 6f  he page cache co
0c90: 6d 65 73 20 75 70 20 69 6e 20 50 41 47 45 52 5f  mes up in PAGER_
0ca0: 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72  UNLOCK.  The fir
0cb0: 73 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c  st time a.** sql
0cc0: 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 6f  ite3PagerGet() o
0cd0: 63 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65  ccurs, the state
0ce0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20   transitions to 
0cf0: 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a  PAGER_SHARED..**
0d00: 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73   After all pages
0d10: 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61   have been relea
0d20: 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  sed using sqlite
0d30: 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a  _page_unref(),.*
0d40: 2a 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e  * the state tran
0d50: 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20  sitions back to 
0d60: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54  PAGER_UNLOCK.  T
0d70: 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a  he first time.**
0d80: 20 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67   that sqlite3Pag
0d90: 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
0da0: 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65 20 74  led, the state t
0db0: 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a  ransitions to.**
0dc0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
0dd0: 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73 71 6c    (Note that sql
0de0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
0df0: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20   can only be.** 
0e00: 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74  called on an out
0e10: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 77 68  standing page wh
0e20: 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ich means that t
0e30: 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a  he pager must.**
0e40: 20 62 65 20 69 6e 20 50 41 47 45 52 5f 53 48 41   be in PAGER_SHA
0e50: 52 45 44 20 62 65 66 6f 72 65 20 69 74 20 74 72  RED before it tr
0e60: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47  ansitions to PAG
0e70: 45 52 5f 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a  ER_RESERVED.).**
0e80: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
0e90: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65  means that there
0ea0: 20 69 73 20 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c   is an open roll
0eb0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  back journal..**
0ec0: 20 54 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20   The transition 
0ed0: 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  to PAGER_EXCLUSI
0ee0: 56 45 20 6f 63 63 75 72 73 20 62 65 66 6f 72 65  VE occurs before
0ef0: 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20   any changes.** 
0f00: 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
0f10: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
0f20: 68 6f 75 67 68 20 77 72 69 74 65 73 20 74 6f 20  hough writes to 
0f30: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  the rollback.** 
0f40: 6a 6f 75 72 6e 61 6c 20 6f 63 63 75 72 73 20 77  journal occurs w
0f50: 69 74 68 20 6a 75 73 74 20 50 41 47 45 52 5f 52  ith just PAGER_R
0f60: 45 53 45 52 56 45 44 2e 20 20 41 66 74 65 72 20  ESERVED.  After 
0f70: 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  an sqlite3PagerR
0f80: 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20  ollback().** or 
0f90: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
0fa0: 69 74 50 68 61 73 65 54 77 6f 28 29 2c 20 74 68  itPhaseTwo(), th
0fb0: 65 20 73 74 61 74 65 20 63 61 6e 20 67 6f 20 62  e state can go b
0fc0: 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ack to PAGER_SHA
0fd0: 52 45 44 2c 0a 2a 2a 20 6f 72 20 69 74 20 63 61  RED,.** or it ca
0fe0: 6e 20 73 74 61 79 20 61 74 20 50 41 47 45 52 5f  n stay at PAGER_
0ff0: 45 58 43 4c 55 53 49 56 45 20 69 66 20 77 65 20  EXCLUSIVE if we 
1000: 61 72 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65  are in exclusive
1010: 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f   access mode..*/
1020: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 55  .#define PAGER_U
1030: 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23 64 65  NLOCK      0.#de
1040: 66 69 6e 65 20 50 41 47 45 52 5f 53 48 41 52 45  fine PAGER_SHARE
1050: 44 20 20 20 20 20 20 31 20 20 20 2f 2a 20 73 61  D      1   /* sa
1060: 6d 65 20 61 73 20 53 48 41 52 45 44 5f 4c 4f 43  me as SHARED_LOC
1070: 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  K */.#define PAG
1080: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 32  ER_RESERVED    2
1090: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 52 45     /* same as RE
10a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23  SERVED_LOCK */.#
10b0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 58 43  define PAGER_EXC
10c0: 4c 55 53 49 56 45 20 20 20 34 20 20 20 2f 2a 20  LUSIVE   4   /* 
10d0: 73 61 6d 65 20 61 73 20 45 58 43 4c 55 53 49 56  same as EXCLUSIV
10e0: 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e  E_LOCK */.#defin
10f0: 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20  e PAGER_SYNCED  
1100: 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d      5../*.** A m
1110: 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69 6e  acro used for in
1120: 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65 63  voking the codec
1130: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
1140: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1150: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64 65  E_HAS_CODEC.# de
1160: 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c  fine CODEC1(P,D,
1170: 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69 66 28  N,X,E) \.    if(
1180: 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20 50 2d   P->xCodec && P-
1190: 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65  >xCodec(P->pCode
11a0: 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b 20 45  c,D,N,X)==0 ){ E
11b0: 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  ; }.# define COD
11c0: 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29  EC2(P,D,N,X,E,O)
11d0: 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e 78 43   \.    if( P->xC
11e0: 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28 63 68  odec==0 ){ O=(ch
11f0: 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c 0a 20  ar*)D; }else \. 
1200: 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61 72 2a     if( (O=(char*
1210: 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70  )(P->xCodec(P->p
1220: 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29 3d 3d  Codec,D,N,X)))==
1230: 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73 65 0a  0 ){ E; }.#else.
1240: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28  # define CODEC1(
1250: 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f 2a 20  P,D,N,X,E)   /* 
1260: 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e  NO-OP */.# defin
1270: 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58  e CODEC2(P,D,N,X
1280: 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a 29 44  ,E,O) O=(char*)D
1290: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
12a0: 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77  he maximum allow
12b0: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20  ed sector size. 
12c0: 31 36 4d 42 2e 20 49 66 20 74 68 65 20 78 53 65  16MB. If the xSe
12d0: 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74 68 6f  ctorsize() metho
12e0: 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  d .** returns a 
12f0: 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74 68 61  value larger tha
1300: 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d 41 58  n this, then MAX
1310: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 73 20  _SECTOR_SIZE is 
1320: 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  used instead..**
1330: 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f 6e 63   This could conc
1340: 65 69 76 61 62 6c 79 20 63 61 75 73 65 20 63 6f  eivably cause co
1350: 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f 77 69  rruption followi
1360: 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  ng a power failu
1370: 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20 61 20  re on.** such a 
1380: 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69 73 20  system. This is 
1390: 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75 6e 64  currently an und
13a0: 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69 74 2e  ocumented limit.
13b0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f  .*/.#define MAX_
13c0: 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78 30 31  SECTOR_SIZE 0x01
13d0: 30 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  00000../*.** An 
13e0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
13f0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
1400: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
1410: 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76 65   for each active
1420: 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61 6e  .** savepoint an
1430: 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  d statement tran
1440: 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73  saction in the s
1450: 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68 20  ystem. All such 
1460: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61 72  structures.** ar
1470: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
1480: 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
1490: 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  [] array, which 
14a0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
14b0: 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69 6e  .** resized usin
14c0: 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  g sqlite3Realloc
14d0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  ()..**.** When a
14e0: 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63 72   savepoint is cr
14f0: 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65 72  eated, the Pager
1500: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
1510: 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a 2a  fset field is.**
1520: 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61 20   set to 0. If a 
1530: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
1540: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
1550: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
1560: 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61 76  while.** the sav
1570: 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
1580: 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73 65  , then iHdrOffse
1590: 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
15a0: 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a 20  byte offset .** 
15b0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
15c0: 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 6a  owing the last j
15d0: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 72  ournal record wr
15e0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d  itten into the m
15f0: 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 62  ain.** journal b
1600: 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e 61  efore the journa
1610: 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20 69  l-header. This i
1620: 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69 6e  s required durin
1630: 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 72  g savepoint.** r
1640: 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61 67  ollback (see pag
1650: 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
1660: 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65 64  int())..*/.typed
1670: 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72 53  ef struct PagerS
1680: 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53 61  avepoint PagerSa
1690: 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74 20  vepoint;.struct 
16a0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 7b  PagerSavepoint {
16b0: 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b 20  .  i64 iOffset; 
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d0: 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66 73  /* Starting offs
16e0: 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e  et in main journ
16f0: 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  al */.  i64 iHdr
1700: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
1710: 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f 76       /* See abov
1720: 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
1730: 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20  InSavepoint;    
1740: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70 61      /* Set of pa
1750: 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76 65  ges in this save
1760: 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  point */.  Pgno 
1770: 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20  nOrig;          
1780: 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
1790: 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  nal number of pa
17a0: 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a 20  ges in file */. 
17b0: 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20 20   Pgno iSubRec;  
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17d0: 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
17e0: 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a 6f  record in sub-jo
17f0: 75 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  urnal */.};../*.
1800: 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63  ** A open page c
1810: 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61  ache is an insta
1820: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
1830: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
1840: 2a 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a  **.** errCode.**
1850: 0a 2a 2a 20 20 20 50 61 67 65 72 2e 65 72 72 43  .**   Pager.errC
1860: 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20 74  ode may be set t
1870: 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  o SQLITE_IOERR, 
1880: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20  SQLITE_CORRUPT, 
1890: 6f 72 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49 54  or.**   or SQLIT
18a0: 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65  E_FULL. Once one
18b0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68   of the first th
18c0: 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72  ree errors occur
18d0: 73 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a  s, it persists.*
18e0: 2a 20 20 20 61 6e 64 20 69 73 20 72 65 74 75 72  *   and is retur
18f0: 6e 65 64 20 61 73 20 74 68 65 20 72 65 73 75 6c  ned as the resul
1900: 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72  t of every major
1910: 20 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e   pager API call.
1920: 20 20 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49 54    The.**   SQLIT
1930: 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f  E_FULL return co
1940: 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64  de is slightly d
1950: 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72  ifferent. It per
1960: 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c  sists only until
1970: 20 74 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20 73   the.**   next s
1980: 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61  uccessful rollba
1990: 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20  ck is performed 
19a0: 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  on the pager cac
19b0: 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20 53  he. Also,.**   S
19c0: 51 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20  QLITE_FULL does 
19d0: 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 73  not affect the s
19e0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
19f0: 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65   and sqlite3Page
1a00: 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20 41  rLookup().**   A
1a10: 50 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74  PIs, they may st
1a20: 69 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63 63  ill be used succ
1a30: 65 73 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20  essfully..**.** 
1a40: 64 62 53 69 7a 65 56 61 6c 69 64 2c 20 64 62 53  dbSizeValid, dbS
1a50: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 2c  ize, dbOrigSize,
1a60: 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a 2a   dbFileSize.**.*
1a70: 2a 20 20 20 4d 61 6e 61 67 69 6e 67 20 74 68 65  *   Managing the
1a80: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1a90: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61  abase file in pa
1aa0: 67 65 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20  ges is a little 
1ab0: 63 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 20  complicated..** 
1ac0: 20 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 50    The variable P
1ad0: 61 67 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e 74  ager.dbSize cont
1ae0: 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ains the number 
1af0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68  of pages that th
1b00: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
1b10: 69 6d 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20  image currently 
1b20: 63 6f 6e 74 61 69 6e 73 2e 20 41 73 20 74 68 65  contains. As the
1b30: 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
1b40: 67 72 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b 73  grows or shrinks
1b50: 20 74 68 69 73 0a 2a 2a 20 20 20 76 61 72 69 61   this.**   varia
1b60: 62 6c 65 20 69 73 20 75 70 64 61 74 65 64 2e 20  ble is updated. 
1b70: 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61 67  The variable Pag
1b80: 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 63 6f  er.dbFileSize co
1b90: 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65  ntains the numbe
1ba0: 72 0a 2a 2a 20 20 20 6f 66 20 70 61 67 65 73 20  r.**   of pages 
1bb0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1bc0: 66 69 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 62  file. This may b
1bd0: 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
1be0: 20 50 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a 2a   Pager.dbSize.**
1bf0: 20 20 20 69 66 20 73 6f 6d 65 20 70 61 67 65 73     if some pages
1c00: 20 68 61 76 65 20 62 65 65 6e 20 61 70 70 65 6e   have been appen
1c10: 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62  ded to the datab
1c20: 61 73 65 20 69 6d 61 67 65 20 62 75 74 20 6e 6f  ase image but no
1c30: 74 20 79 65 74 20 77 72 69 74 74 65 6e 0a 2a 2a  t yet written.**
1c40: 20 20 20 6f 75 74 20 66 72 6f 6d 20 74 68 65 20     out from the 
1c50: 63 61 63 68 65 20 74 6f 20 74 68 65 20 61 63 74  cache to the act
1c60: 75 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ual file on disk
1c70: 2e 20 4f 72 20 69 66 20 74 68 65 20 69 6d 61 67  . Or if the imag
1c80: 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20  e has been.**   
1c90: 74 72 75 6e 63 61 74 65 64 20 62 79 20 61 6e 20  truncated by an 
1ca0: 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
1cb0: 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68  um operation. Th
1cc0: 65 20 50 61 67 65 72 2e 64 62 4f 72 69 67 53 69  e Pager.dbOrigSi
1cd0: 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20  ze variable.**  
1ce0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75   contains the nu
1cf0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1d00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
1d10: 61 67 65 20 77 68 65 6e 20 74 68 65 20 63 75 72  age when the cur
1d20: 72 65 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73 61  rent.**   transa
1d30: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
1d40: 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  . The contents o
1d50: 66 20 61 6c 6c 20 74 68 72 65 65 20 6f 66 20 74  f all three of t
1d60: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 69  hese variables i
1d70: 73 0a 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61 72  s.**   only guar
1d80: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 63 6f 72  anteed to be cor
1d90: 72 65 63 74 20 69 66 20 74 68 65 20 62 6f 6f 6c  rect if the bool
1da0: 65 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  ean Pager.dbSize
1db0: 56 61 6c 69 64 20 69 73 20 74 72 75 65 2e 0a 2a  Valid is true..*
1dc0: 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e 64  *.**   TODO: Und
1dd0: 65 72 20 77 68 61 74 20 63 6f 6e 64 69 74 69 6f  er what conditio
1de0: 6e 73 20 69 73 20 64 62 53 69 7a 65 56 61 6c 69  ns is dbSizeVali
1df0: 64 20 73 65 74 3f 20 43 6c 65 61 72 65 64 3f 0a  d set? Cleared?.
1e00: 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e  **.** changeCoun
1e10: 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  tDone.**.**   Th
1e20: 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  is boolean varia
1e30: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ble is used to m
1e40: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
1e50: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1e60: 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79   .**   (the 4-by
1e70: 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  te header field 
1e80: 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32  at byte offset 2
1e90: 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  4 of the databas
1ea0: 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20  e file) is .**  
1eb0: 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72   not updated mor
1ec0: 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63  e often than nec
1ed0: 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20  essary. .**.**  
1ee0: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72   It is set to tr
1ef0: 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e  ue when the chan
1f00: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
1f10: 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69   is updated, whi
1f20: 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c  ch .**   can onl
1f30: 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65  y happen if an e
1f40: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
1f50: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1f60: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
1f70: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28   It is cleared (
1f80: 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68  set to false) wh
1f90: 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73  enever an exclus
1fa0: 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  ive lock is .** 
1fb0: 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f    relinquished o
1fc0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1fd0: 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61  ile. Each time a
1fe0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1ff0: 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20  committed,.**   
2000: 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  The changeCountD
2010: 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70  one flag is insp
2020: 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20  ected. If it is 
2030: 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f  true, the work o
2040: 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20  f.**   updating 
2050: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
2060: 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f  er is omitted fo
2070: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  r the current tr
2080: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
2090: 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73     This mechanis
20a0: 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65  m means that whe
20b0: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  n running in exc
20c0: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63  lusive mode, a c
20d0: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  onnection .**   
20e0: 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65  need only update
20f0: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
2100: 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68  ter once, for th
2110: 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74  e first transact
2120: 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74  ion.**   committ
2130: 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64 69  ed..**.** dbModi
2140: 66 69 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  fied.**.**   The
2150: 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67   dbModified flag
2160: 20 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72   is set whenever
2170: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
2180: 20 69 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a 20   is dirtied..** 
2190: 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20    It is cleared 
21a0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61  at the end of ea
21b0: 63 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ch transaction..
21c0: 2a 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 75 73  **.**   It is us
21d0: 65 64 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69  ed when committi
21e0: 6e 67 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20  ng or otherwise 
21f0: 65 6e 64 69 6e 67 20 61 20 74 72 61 6e 73 61 63  ending a transac
2200: 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74 68  tion. If.**   th
2210: 65 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61  e dbModified fla
2220: 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20  g is clear then 
2230: 6c 65 73 73 20 77 6f 72 6b 20 68 61 73 20 74 6f  less work has to
2240: 20 62 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   be done..**.** 
2250: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 0a 2a  journalStarted.*
2260: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 66 6c 61 67  *.**   This flag
2270: 20 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72   is set whenever
2280: 20 74 68 65 20 74 68 65 20 6d 61 69 6e 20 6a 6f   the the main jo
2290: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2e  urnal is synced.
22a0: 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 70 6f   .**.**   The po
22b0: 69 6e 74 20 6f 66 20 74 68 69 73 20 66 6c 61 67  int of this flag
22c0: 20 69 73 20 74 68 61 74 20 69 74 20 6d 75 73 74   is that it must
22d0: 20 62 65 20 73 65 74 20 61 66 74 65 72 20 74 68   be set after th
22e0: 65 20 0a 2a 2a 20 20 20 66 69 72 73 74 20 6a 6f  e .**   first jo
22f0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20  urnal header in 
2300: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  a journal file h
2310: 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74  as been synced t
2320: 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41 66 74  o disk..**   Aft
2330: 65 72 20 74 68 69 73 20 68 61 73 20 68 61 70 70  er this has happ
2340: 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65 73 20  ened, new pages 
2350: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
2360: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 64  database .**   d
2370: 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20 50  o not need the P
2380: 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
2390: 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68 65 79  lag set, as they
23a0: 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a 20   do not need.** 
23b0: 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61 20    to wait for a 
23c0: 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62 65 66  journal sync bef
23d0: 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62 65 20  ore they can be 
23e0: 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 2a  written out to.*
23f0: 2a 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65  *   the database
2400: 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e 63 74   file (see funct
2410: 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74 65 28  ion pager_write(
2420: 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73 65 74  ))..**   .** set
2430: 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 54  Master.**.**   T
2440: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
2450: 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  used to ensure t
2460: 68 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a  hat the master j
2470: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
2480: 0a 2a 2a 20 20 20 28 69 66 20 61 6e 79 29 20 69  .**   (if any) i
2490: 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e 20 69  s only written i
24a0: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
24b0: 66 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a 2a 2a  file once..**.**
24c0: 20 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74 74 69     When committi
24d0: 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
24e0: 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  , the master jou
24f0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 28  rnal file name (
2500: 69 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d 61 79  if any).**   may
2510: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
2520: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2530: 65 20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65  e while the page
2540: 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a 2a 2a  r is still in.**
2550: 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56 45     PAGER_RESERVE
2560: 44 20 73 74 61 74 65 20 28 73 65 65 20 43 6f 6d  D state (see Com
2570: 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 66 6f  mitPhaseOne() fo
2580: 72 20 74 68 65 20 61 63 74 69 6f 6e 29 2e 20 49  r the action). I
2590: 74 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74 74 65  t.**   then atte
25a0: 6d 70 74 73 20 74 6f 20 75 70 67 72 61 64 65 20  mpts to upgrade 
25b0: 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  to an exclusive 
25c0: 6c 6f 63 6b 2e 20 49 66 20 74 68 69 73 20 61 74  lock. If this at
25d0: 74 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69 6c 73  tempt.**   fails
25e0: 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 42 55  , then SQLITE_BU
25f0: 53 59 20 6d 61 79 20 62 65 20 72 65 74 75 72 6e  SY may be return
2600: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20 61  ed to the user a
2610: 6e 64 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 20  nd the user.**  
2620: 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f 20   may attempt to 
2630: 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
2640: 61 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61 74  action again lat
2650: 65 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a 20 20  er (calling.**  
2660: 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28   CommitPhaseOne(
2670: 29 20 61 67 61 69 6e 29 2e 20 54 68 69 73 20 66  ) again). This f
2680: 6c 61 67 20 69 73 20 75 73 65 64 20 74 6f 20 65  lag is used to e
2690: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 0a  nsure that the .
26a0: 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72  **   master jour
26b0: 6e 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e 6c 79  nal name is only
26c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
26d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
26e0: 20 66 69 72 73 74 0a 2a 2a 20 20 20 74 69 6d 65   first.**   time
26f0: 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28   CommitPhaseOne(
2700: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  ) is called..**.
2710: 2a 2a 20 64 6f 4e 6f 74 53 79 6e 63 0a 2a 2a 0a  ** doNotSync.**.
2720: 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61 62  **   This variab
2730: 6c 65 20 69 73 20 73 65 74 20 61 6e 64 20 63 6c  le is set and cl
2740: 65 61 72 65 64 20 62 79 20 73 71 6c 69 74 65 33  eared by sqlite3
2750: 50 61 67 65 72 57 72 69 74 65 28 29 2e 0a 2a 2a  PagerWrite()..**
2760: 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a 0a  .** needSync.**.
2770: 2a 2a 20 20 20 54 4f 44 4f 3a 20 49 74 20 6d 69  **   TODO: It mi
2780: 67 68 74 20 62 65 20 65 61 73 69 65 72 20 74 6f  ght be easier to
2790: 20 73 65 74 20 74 68 69 73 20 76 61 72 69 61 62   set this variab
27a0: 6c 65 20 69 6e 20 77 72 69 74 65 4a 6f 75 72 6e  le in writeJourn
27b0: 61 6c 48 64 72 28 29 0a 2a 2a 20 20 20 61 6e 64  alHdr().**   and
27c0: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
27d0: 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20 43 68 61 6e  nal() only. Chan
27e0: 67 65 20 69 74 73 20 6d 65 61 6e 69 6e 67 20 74  ge its meaning t
27f0: 6f 20 22 75 6e 73 79 6e 63 65 64 20 64 61 74 61  o "unsynced data
2800: 0a 2a 2a 20 20 20 68 61 73 20 62 65 65 6e 20 77  .**   has been w
2810: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
2820: 75 72 6e 61 6c 22 2e 0a 2a 2a 0a 2a 2a 20 73 75  urnal"..**.** su
2830: 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a  bjInMemory.**.**
2840: 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f 6f     This is a boo
2850: 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20 49  lean variable. I
2860: 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79  f true, then any
2870: 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a 6f   required sub-jo
2880: 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f 70  urnal.**   is op
2890: 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65  ened as an in-me
28a0: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  mory journal fil
28b0: 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68 65  e. If false, the
28c0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20  n in-memory.**  
28d0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61 72   sub-journals ar
28e0: 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20  e only used for 
28f0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20  in-memory pager 
2900: 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  files..*/.struct
2910: 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74   Pager {.  sqlit
2920: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
2930: 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e         /* OS fun
2940: 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f  ctions to use fo
2950: 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63  r IO */.  u8 exc
2960: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
2970: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
2980: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
2990: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
29a0: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
29b0: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
29c0: 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68 65 20     /* On of the 
29d0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
29e0: 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  E_* values */.  
29f0: 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20  u8 useJournal;  
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
2a10: 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  se a rollback jo
2a20: 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69  urnal on this fi
2a30: 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61  le */.  u8 noRea
2a40: 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  dlock;          
2a50: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f      /* Do not bo
2a60: 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72  ther to obtain r
2a70: 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38  eadlocks */.  u8
2a80: 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20   noSync;        
2a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
2aa0: 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  not sync the jou
2ab0: 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a  rnal if true */.
2ac0: 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20    u8 fullSync;  
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ae0: 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20   Do extra syncs 
2af0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
2b00: 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f  or robustness */
2b10: 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c 61 67 73  .  u8 sync_flags
2b20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2b30: 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e 4f  * One of SYNC_NO
2b40: 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c  RMAL or SYNC_FUL
2b50: 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69  L */.  u8 tempFi
2b60: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
2b70: 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
2b80: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
2b90: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64  ile */.  u8 read
2ba0: 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20  Only;           
2bb0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
2bc0: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
2bd0: 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d 65  abase */.  u8 me
2be0: 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  mDb;            
2bf0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
2c00: 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69  o inhibit all fi
2c10: 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a 20  le I/O */..  /* 
2c20: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
2c30: 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f  ock contains tho
2c40: 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73  se class members
2c50: 20 74 68 61 74 20 61 72 65 20 64 79 6e 61 6d 69   that are dynami
2c60: 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d 6f 64 69 66  cally.  ** modif
2c70: 69 65 64 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61  ied during norma
2c80: 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 54 68  l operations. Th
2c90: 65 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c 65  e other variable
2ca0: 73 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  s in this struct
2cb0: 75 72 65 0a 20 20 2a 2a 20 61 72 65 20 65 69 74  ure.  ** are eit
2cc0: 68 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 72  her constant thr
2cd0: 6f 75 67 68 6f 75 74 20 74 68 65 20 6c 69 66 65  oughout the life
2ce0: 74 69 6d 65 20 6f 66 20 74 68 65 20 70 61 67 65  time of the page
2cf0: 72 2c 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20  r, or else.  ** 
2d00: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 63 6f  used to store co
2d10: 6e 66 69 67 75 72 61 74 69 6f 6e 20 70 61 72 61  nfiguration para
2d20: 6d 65 74 65 72 73 20 74 68 61 74 20 61 66 66 65  meters that affe
2d30: 63 74 20 74 68 65 20 77 61 79 20 74 68 65 20 70  ct the way the p
2d40: 61 67 65 72 20 0a 20 20 2a 2a 20 6f 70 65 72 61  ager .  ** opera
2d50: 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  tes..  **.  ** T
2d60: 68 65 20 27 73 74 61 74 65 27 20 76 61 72 69 61  he 'state' varia
2d70: 62 6c 65 20 69 73 20 64 65 73 63 72 69 62 65 64  ble is described
2d80: 20 69 6e 20 6d 6f 72 65 20 64 65 74 61 69 6c 20   in more detail 
2d90: 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 0a 20  along with the. 
2da0: 20 2a 2a 20 64 65 73 63 72 69 70 74 69 6f 6e 73   ** descriptions
2db0: 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20 69   of the values i
2dc0: 74 20 6d 61 79 20 74 61 6b 65 20 2d 20 50 41 47  t may take - PAG
2dd0: 45 52 5f 55 4e 4c 4f 43 4b 20 65 74 63 2e 20 4d  ER_UNLOCK etc. M
2de0: 61 6e 79 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  any of the.  ** 
2df0: 6f 74 68 65 72 20 76 61 72 69 61 62 6c 65 73 20  other variables 
2e00: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
2e10: 65 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74  e described in t
2e20: 68 65 20 63 6f 6d 6d 65 6e 74 20 64 69 72 65 63  he comment direc
2e30: 74 6c 79 20 0a 20 20 2a 2a 20 61 62 6f 76 65 20  tly .  ** above 
2e40: 74 68 69 73 20 63 6c 61 73 73 20 64 65 66 69 6e  this class defin
2e50: 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 75 38  ition..  */.  u8
2e60: 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20   state;         
2e70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
2e80: 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52  ER_UNLOCK, _SHAR
2e90: 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20 65  ED, _RESERVED, e
2ea0: 74 63 2e 20 2a 2f 0a 20 20 75 38 20 64 62 4d 6f  tc. */.  u8 dbMo
2eb0: 64 69 66 69 65 64 3b 20 20 20 20 20 20 20 20 20  dified;         
2ec0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2ed0: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 63 68  there are any ch
2ee0: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 44 62 20  anges to the Db 
2ef0: 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63  */.  u8 needSync
2f00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f10: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66   /* True if an f
2f20: 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64  sync() is needed
2f30: 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
2f40: 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53  */.  u8 journalS
2f50: 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20 20  tarted;         
2f60: 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61 64   /* True if head
2f70: 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73  er of journal is
2f80: 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20   synced */.  u8 
2f90: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b  changeCountDone;
2fa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
2fb0: 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69  after incrementi
2fc0: 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  ng the change-co
2fd0: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65  unter */.  u8 se
2fe0: 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20  tMaster;        
2ff0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3000: 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73  f a m-j name has
3010: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
3020: 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f   jrnl */.  u8 do
3030: 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20 20  NotSync;        
3040: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
3050: 6e 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20 64  n. While true, d
3060: 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20  o not spill the 
3070: 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 64 62  cache */.  u8 db
3080: 53 69 7a 65 56 61 6c 69 64 3b 20 20 20 20 20 20  SizeValid;      
3090: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 77 68         /* Set wh
30a0: 65 6e 20 64 62 53 69 7a 65 20 69 73 20 63 6f 72  en dbSize is cor
30b0: 72 65 63 74 20 2a 2f 0a 20 20 75 38 20 73 75 62  rect */.  u8 sub
30c0: 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20 20  jInMemory;      
30d0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
30e0: 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   use in-memory s
30f0: 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20  ub-journals */. 
3100: 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20 20   Pgno dbSize;   
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3120: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
3130: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
3140: 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69 67  */.  Pgno dbOrig
3150: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
3160: 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72   /* dbSize befor
3170: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  e the current tr
3180: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 50  ansaction */.  P
3190: 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b 20  gno dbFileSize; 
31a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
31b0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
31c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31d0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43  le */.  int errC
31e0: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
31f0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65      /* One of se
3200: 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65  veral kinds of e
3210: 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  rrors */.  int n
3220: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
3230: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20         /* Pages 
3240: 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63 65  journalled since
3250: 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20 77   last j-header w
3260: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32 20  ritten */.  u32 
3270: 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20  cksumInit;      
3280: 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69          /* Quasi
3290: 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64  -random value ad
32a0: 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65  ded to every che
32b0: 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20 6e  cksum */.  u32 n
32c0: 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20 20  SubRec;         
32d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
32e0: 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69 74   of records writ
32f0: 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72 6e  ten to sub-journ
3300: 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  al */.  Bitvec *
3310: 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  pInJournal;     
3320: 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66      /* One bit f
3330: 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
3340: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
3350: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
3360: 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20 20  ile *fd;        
3370: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
3380: 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62 61  iptor for databa
3390: 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  se */.  sqlite3_
33a0: 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20  file *jfd;      
33b0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
33c0: 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e 20  riptor for main 
33d0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c  journal */.  sql
33e0: 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64 3b  ite3_file *sjfd;
33f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
3400: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
3410: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  sub-journal */. 
3420: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b   i64 journalOff;
3430: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3440: 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f 66  Current write of
3450: 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  fset in the jour
3460: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
3470: 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20  4 journalHdr;   
3480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
3490: 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76  e offset to prev
34a0: 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61  ious journal hea
34b0: 64 65 72 20 2a 2f 0a 20 20 50 61 67 65 72 53 61  der */.  PagerSa
34c0: 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70 6f  vepoint *aSavepo
34d0: 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f 66  int; /* Array of
34e0: 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
34f0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 76  ts */.  int nSav
3500: 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 20  epoint;         
3510: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3520: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53 61   elements in aSa
3530: 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20 63  vepoint[] */.  c
3540: 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31  har dbFileVers[1
3550: 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68  6];        /* Ch
3560: 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64  anges whenever d
3570: 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
3580: 6e 67 65 73 20 2a 2f 0a 20 20 75 33 32 20 73 65  nges */.  u32 se
3590: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
35a0: 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64        /* Assumed
35b0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72   sector size dur
35c0: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ing rollback */.
35d0: 0a 20 20 75 31 36 20 6e 45 78 74 72 61 3b 20 20  .  u16 nExtra;  
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35f0: 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20  * Add this many 
3600: 62 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e  bytes to each in
3610: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
3620: 20 20 69 31 36 20 6e 52 65 73 65 72 76 65 3b 20    i16 nReserve; 
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3640: 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65   Number of unuse
3650: 64 20 62 79 74 65 73 20 61 74 20 65 6e 64 20 6f  d bytes at end o
3660: 66 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  f each page */. 
3670: 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b 20 20   u32 vfsFlags;  
3680: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3690: 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65  Flags for sqlite
36a0: 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
36b0: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
36c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
36e0: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
36f0: 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20   Pgno mxPgno;   
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3710: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
3720: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
3730: 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  base */.  char *
3740: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
3750: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
3760: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3770: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
3780: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
3790: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
37a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
37b0: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  */.  int (*xBusy
37c0: 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b  Handler)(void*);
37d0: 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
37e0: 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a  call when busy *
37f0: 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
3800: 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20  andlerArg;      
3810: 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d  /* Context argum
3820: 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e  ent for xBusyHan
3830: 64 6c 65 72 20 2a 2f 0a 23 69 66 64 65 66 20 53  dler */.#ifdef S
3840: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
3850: 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20 20   nHit, nMiss;   
3860: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68           /* Cach
3870: 65 20 68 69 74 73 20 61 6e 64 20 6d 69 73 73 69  e hits and missi
3880: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61  ng */.  int nRea
3890: 64 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20  d, nWrite;      
38a0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
38b0: 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74 74  pages read/writt
38c0: 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76  en */.#endif.  v
38d0: 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29  oid (*xReiniter)
38e0: 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61  (DbPage*); /* Ca
38f0: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
3900: 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70  when reloading p
3910: 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53  ages */.#ifdef S
3920: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
3930: 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63    void *(*xCodec
3940: 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67  )(void*,void*,Pg
3950: 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74  no,int); /* Rout
3960: 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64  ine for en/decod
3970: 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  ing data */.  vo
3980: 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43  id (*xCodecSizeC
3990: 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69  hng)(void*,int,i
39a0: 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f  nt); /* Notify o
39b0: 66 20 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e  f page size chan
39c0: 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ges */.  void (*
39d0: 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64  xCodecFree)(void
39e0: 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *);             
39f0: 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f  /* Destructor fo
3a00: 72 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20  r the codec */. 
3a10: 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20   void *pCodec;  
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3a30: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
3a40: 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68  o xCodec... meth
3a50: 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ods */.#endif.  
3a60: 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b  char *pTmpSpace;
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3a80: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79  ager.pageSize by
3a90: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
3aa0: 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 69 36   tmp use */.  i6
3ab0: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  4 journalSizeLim
3ac0: 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  it;       /* Siz
3ad0: 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73  e limit for pers
3ae0: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  istent journal f
3af0: 69 6c 65 73 20 2a 2f 0a 20 20 50 43 61 63 68 65  iles */.  PCache
3b00: 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20   *pPCache;      
3b10: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
3b20: 20 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f   to page cache o
3b30: 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
3b40: 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b  e3_backup *pBack
3b50: 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  up;    /* Pointe
3b60: 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67  r to list of ong
3b70: 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63  oing backup proc
3b80: 65 73 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  esses */.};../*.
3b90: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
3ba0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
3bb0: 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20  s hold counters 
3bc0: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
3bd0: 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c  ing purposes onl
3be0: 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  y.  These variab
3bf0: 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  les do not exist
3c00: 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73   in.** a non-tes
3c10: 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65  ting build.  The
3c20: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
3c30: 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65   not thread-safe
3c40: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
3c50: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
3c60: 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
3c70: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
3c80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
3c90: 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d   pages read from
3ca0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
3cb0: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
3cc0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a  _count = 0;   /*
3cd0: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
3ce0: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
3cf0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
3d00: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
3d10: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
3d20: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
3d30: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
3d40: 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  nal */.# define 
3d50: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76  PAGER_INCR(v)  v
3d60: 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ++.#else.# defin
3d70: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a  e PAGER_INCR(v).
3d80: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
3d90: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
3da0: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
3db0: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
3dc0: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
3dd0: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
3de0: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
3df0: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
3e00: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
3e10: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
3e20: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
3e30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
3e40: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
3e50: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
3e60: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
3e70: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
3e80: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
3e90: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
3ea0: 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e  being.** written
3eb0: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
3ec0: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
3ed0: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
3ee0: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
3ef0: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
3f00: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
3f10: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
3f20: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
3f30: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
3f40: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
3f50: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
3f60: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
3f70: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
3f80: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
3f90: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
3fa0: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
3fb0: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
3fc0: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
3fd0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
3fe0: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
3ff0: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
4000: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
4010: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
4020: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
4030: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
4040: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
4050: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
4060: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
4070: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
4080: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
4090: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
40a0: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
40b0: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
40c0: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
40d0: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
40e0: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
40f0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
4100: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
4110: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
4120: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
4130: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
4140: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
4150: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
4160: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
4170: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
4180: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
4190: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
41a0: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
41b0: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
41c0: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
41d0: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
41e0: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
41f0: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
4200: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
4210: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
4220: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
4230: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
4240: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
4250: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
4260: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
4270: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
4280: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
4290: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
42a0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
42b0: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
42c0: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
42d0: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
42e0: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
42f0: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
4300: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
4310: 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63  ze of the of eac
4320: 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e  h page record in
4330: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
4340: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20  given by.** the 
4350: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e  following macro.
4360: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
4370: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
4380: 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67  )  ((pPager->pag
4390: 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a  eSize) + 8)../*.
43a0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** The journal h
43b0: 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74  eader size for t
43c0: 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20  his pager. This 
43d0: 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73  is usually the s
43e0: 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20  ame .** size as 
43f0: 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
4400: 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73  ctor. See also s
4410: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a  etSectorSize()..
4420: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
4430: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
4440: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
4450: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
4460: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
4470: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
4480: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
4490: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
44a0: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
44b0: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
44c0: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
44d0: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
44e0: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
44f0: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
4500: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
4510: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
4520: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
4530: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
4540: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
4550: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
4560: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
4570: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
4580: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
4590: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
45a0: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
45b0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
45c0: 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20  e maximum legal 
45d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28  page number is (
45e0: 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64  2^31 - 1)..*/.#d
45f0: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f  efine PAGER_MAX_
4600: 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a  PGNO 2147483647.
4610: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
4620: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a  ./*.** Usage:.**
4630: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73  .**   assert( as
4640: 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
4650: 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2f 0a 73  (pPager) );.*/.s
4660: 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74  tatic int assert
4670: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67  _pager_state(Pag
4680: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20  er *pPager){..  
4690: 2f 2a 20 41 20 74 65 6d 70 2d 66 69 6c 65 20 69  /* A temp-file i
46a0: 73 20 61 6c 77 61 79 73 20 69 6e 20 50 41 47 45  s always in PAGE
46b0: 52 5f 45 58 43 4c 55 53 49 56 45 20 6f 72 20 50  R_EXCLUSIVE or P
46c0: 41 47 45 52 5f 53 59 4e 43 45 44 20 73 74 61 74  AGER_SYNCED stat
46d0: 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
46e0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
46f0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ==0 || pPager->s
4700: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
4710: 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 54  USIVE );..  /* T
4720: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
4730: 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79  ne flag is alway
4740: 73 20 73 65 74 20 66 6f 72 20 74 65 6d 70 2d 66  s set for temp-f
4750: 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  iles */.  assert
4760: 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
4770: 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  le==0 || pPager-
4780: 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
4790: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b   );..  return 1;
47a0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
47b0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
47c0: 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
47d0: 74 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70  to write page *p
47e0: 50 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  Pg into the sub-
47f0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61  journal..** A pa
4800: 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77  ge needs to be w
4810: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
4820: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74  sub-journal if t
4830: 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a  here exists one.
4840: 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20  ** or more open 
4850: 73 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77  savepoints for w
4860: 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  hich:.**.**   * 
4870: 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  The page-number 
4880: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
4890: 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61  equal to PagerSa
48a0: 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61  vepoint.nOrig, a
48b0: 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69  nd.**   * The bi
48c0: 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
48d0: 74 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  to the page-numb
48e0: 65 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e  er is not set in
48f0: 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
4900: 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
4910: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
4920: 6e 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  nt subjRequiresP
4930: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
4940: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
4950: 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  Pg->pgno;.  Page
4960: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
4970: 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69  >pPager;.  int i
4980: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
4990: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
49a0: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67  t; i++){.    Pag
49b0: 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d  erSavepoint *p =
49c0: 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
49d0: 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28  oint[i];.    if(
49e0: 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20   p->nOrig>=pgno 
49f0: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74  && 0==sqlite3Bit
4a00: 76 65 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61  vecTest(p->pInSa
4a10: 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29  vepoint, pgno) )
4a20: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
4a30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
4a40: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
4a50: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
4a60: 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65  the page is alre
4a70: 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
4a80: 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  al file..*/.stat
4a90: 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75  ic int pageInJou
4aa0: 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29  rnal(PgHdr *pPg)
4ab0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
4ac0: 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 67  e3BitvecTest(pPg
4ad0: 2d 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ->pPager->pInJou
4ae0: 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
4af0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
4b00: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
4b10: 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20   from the given 
4b20: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
4b30: 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65    Store the inte
4b40: 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72  ger.** that is r
4b50: 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52  ead in *pRes.  R
4b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
4b70: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
4b80: 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65  rked, or an.** e
4b90: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
4ba0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
4bb0: 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c  g..**.** All val
4bc0: 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f  ues are stored o
4bd0: 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e  n disk as big-en
4be0: 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dian..*/.static 
4bf0: 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73  int read32bits(s
4c00: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
4c10: 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32   i64 offset, u32
4c20: 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67   *pRes){.  unsig
4c30: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
4c40: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
4c50: 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c  e3OsRead(fd, ac,
4c60: 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66   sizeof(ac), off
4c70: 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  set);.  if( rc==
4c80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4c90: 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33   *pRes = sqlite3
4ca0: 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20  Get4byte(ac);.  
4cb0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4cc0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
4cd0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
4ce0: 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66  nto a string buf
4cf0: 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  fer in big-endia
4d00: 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f  n byte order..*/
4d10: 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69  .#define put32bi
4d20: 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33  ts(A,B)  sqlite3
4d30: 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c  Put4byte((u8*)A,
4d40: 42 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  B)../*.** Write 
4d50: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
4d60: 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20   into the given 
4d70: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
4d80: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
4d90: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
4da0: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
4db0: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
4dc0: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
4dd0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
4de0: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
4df0: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
4e00: 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63  t, u32 val){.  c
4e10: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74  har ac[4];.  put
4e20: 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b  32bits(ac, val);
4e30: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
4e40: 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c  3OsWrite(fd, ac,
4e50: 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a   4, offset);.}..
4e60: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
4e70: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
4e80: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
4e90: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
4ea0: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
4eb0: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
4ec0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
4ed0: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
4ee0: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
4ef0: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
4f00: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
4f10: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
4f20: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
4f30: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
4f40: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
4f50: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
4f60: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
4f70: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
4f80: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
4f90: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
4fa0: 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a  ->pMethods)../*.
4fb0: 2a 2a 20 49 66 20 66 69 6c 65 20 70 46 64 20 69  ** If file pFd i
4fc0: 73 20 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c  s open, call sql
4fd0: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f  ite3OsUnlock() o
4fe0: 6e 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  n it..*/.static 
4ff0: 69 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c  int osUnlock(sql
5000: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20  ite3_file *pFd, 
5010: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66  int eLock){.  if
5020: 28 20 21 69 73 4f 70 65 6e 28 70 46 64 29 20 29  ( !isOpen(pFd) )
5030: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
5040: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
5050: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e  turn sqlite3OsUn
5060: 6c 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29  lock(pFd, eLock)
5070: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
5080: 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69  function determi
5090: 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e  nes whether or n
50a0: 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ot the atomic-wr
50b0: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
50c0: 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20  .** can be used 
50d0: 77 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e  with this pager.
50e0: 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   The optimizatio
50f0: 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66  n can be used if
5100: 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65  :.**.**  (a) the
5110: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
5120: 62 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61  by OsDeviceChara
5130: 63 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64  cteristics() ind
5140: 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20  icates that.**  
5150: 20 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70      a database p
5160: 61 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74  age may be writt
5170: 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61  en atomically, a
5180: 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76  nd.**  (b) the v
5190: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
51a0: 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20   OsSectorSize() 
51b0: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
51c0: 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f  equal.**      to
51d0: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a   the page size..
51e0: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69  **.** The optimi
51f0: 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61  zation is also a
5200: 6c 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f  lways enabled fo
5210: 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
5220: 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65  s. It is.** an e
5230: 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69  rror to call thi
5240: 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50  s function if pP
5250: 61 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f  ager is opened o
5260: 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  n an in-memory.*
5270: 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  * database..**.*
5280: 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  * If the optimiz
5290: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ation cannot be 
52a0: 75 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72  used, 0 is retur
52b0: 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62  ned. If it can b
52c0: 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  e used,.** then 
52d0: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
52e0: 65 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ed is the size o
52f0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
5300: 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f  le when it.** co
5310: 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20  ntains rollback 
5320: 64 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79  data for exactly
5330: 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   one page..*/.#i
5340: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
5350: 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
5360: 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42  static int jrnlB
5370: 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20  ufferSize(Pager 
5380: 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65  *pPager){.  asse
5390: 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
53a0: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
53b0: 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  pFile ){.    int
53c0: 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   dc;            
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
53e0: 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74  * Device charact
53f0: 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20  eristics */.    
5400: 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20  int nSector;    
5410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5420: 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65    /* Sector size
5430: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61   */.    int szPa
5440: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
5450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
5460: 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61  e size */..    a
5470: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
5480: 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20  ager->fd) );.   
5490: 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   dc = sqlite3OsD
54a0: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
54b0: 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
54c0: 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20  ;.    nSector = 
54d0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
54e0: 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d  ze;.    szPage =
54f0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
5500: 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53  e;..    assert(S
5510: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
5520: 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
5530: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c  ;.    assert(SQL
5540: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
5550: 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29  64K==(65536>>8))
5560: 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63  ;.    if( 0==(dc
5570: 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
5580: 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38  TOMIC|(szPage>>8
5590: 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a  )) || nSector>sz
55a0: 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72  Page) ){.      r
55b0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
55c0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55   }..  return JOU
55d0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
55e0: 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47  er) + JOURNAL_PG
55f0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23  _SZ(pPager);.}.#
5600: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
5610: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
5620: 45 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68  ES is defined th
5630: 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61  en we do some sa
5640: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  nity checking.**
5650: 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73   on the cache us
5660: 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74  ing a hash funct
5670: 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73  ion.  This is us
5680: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a  ed for testing.*
5690: 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  * and debugging 
56a0: 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  only..*/.#ifdef 
56b0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
56c0: 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ES./*.** Return 
56d0: 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66  a 32-bit hash of
56e0: 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66   the page data f
56f0: 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  or pPage..*/.sta
5700: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61  tic u32 pager_da
5710: 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65  tahash(int nByte
5720: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
5730: 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68  *pData){.  u32 h
5740: 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ash = 0;.  int i
5750: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
5760: 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Byte; i++){.    
5770: 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33  hash = (hash*103
5780: 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20  9) + pData[i];. 
5790: 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68   }.  return hash
57a0: 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70  ;.}.static u32 p
57b0: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67  ager_pagehash(Pg
57c0: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72  Hdr *pPage){.  r
57d0: 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61  eturn pager_data
57e0: 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67  hash(pPage->pPag
57f0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75  er->pageSize, (u
5800: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
5810: 50 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a  Page->pData);.}.
5820: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
5830: 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50  r_set_pagehash(P
5840: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
5850: 70 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20  pPage->pageHash 
5860: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
5870: 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pPage);.}../*.*
5880: 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45  * The CHECK_PAGE
5890: 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50   macro takes a P
58a0: 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75  gHdr* as an argu
58b0: 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f  ment. If SQLITE_
58c0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69  CHECK_PAGES.** i
58d0: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e  s defined, and N
58e0: 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66  DEBUG is not def
58f0: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
5900: 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63  ) statement chec
5910: 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70  ks.** that the p
5920: 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69  age is either di
5930: 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74  rty or still mat
5940: 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61  ches the calcula
5950: 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a  ted page-hash..*
5960: 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  /.#define CHECK_
5970: 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67  PAGE(x) checkPag
5980: 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64  e(x).static void
5990: 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72   checkPage(PgHdr
59a0: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
59b0: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
59c0: 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28  Pager;.  assert(
59d0: 20 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20   !pPg->pageHash 
59e0: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
59f0: 64 65 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67  de.      || (pPg
5a00: 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
5a10: 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67  RTY) || pPg->pag
5a20: 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67  eHash==pager_pag
5a30: 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a  ehash(pPg) );.}.
5a40: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70  .#else.#define p
5a50: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c  ager_datahash(X,
5a60: 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61  Y)  0.#define pa
5a70: 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20  ger_pagehash(X) 
5a80: 20 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b   0.#define CHECK
5a90: 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20  _PAGE(x).#endif 
5aa0: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   /* SQLITE_CHECK
5ab0: 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _PAGES */../*.**
5ac0: 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
5ad0: 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lled the journal
5ae0: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
5af0: 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f  pPager must be o
5b00: 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e  pen..** This fun
5b10: 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
5b20: 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20  o read a master 
5b30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
5b40: 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65  e from the .** e
5b50: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61  nd of the file a
5b60: 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75  nd, if successfu
5b70: 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74  l, copies it int
5b80: 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65  o memory supplie
5b90: 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  d .** by the cal
5ba0: 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ler. See comment
5bb0: 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73  s above writeMas
5bc0: 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72  terJournal() for
5bd0: 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75   the format.** u
5be0: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d  sed to store a m
5bf0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
5c00: 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65  le name at the e
5c10: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
5c20: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73  file..**.** zMas
5c30: 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ter must point t
5c40: 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74  o a buffer of at
5c50: 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62   least nMaster b
5c60: 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ytes allocated b
5c70: 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e  y.** the caller.
5c80: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
5c90: 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
5ca0: 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73  thname+1 (to ens
5cb0: 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  ure there is.** 
5cc0: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20  enough space to 
5cd0: 77 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  write the master
5ce0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20   journal name). 
5cf0: 49 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  If the master jo
5d00: 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e  urnal.** name in
5d10: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
5d20: 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73  longer than nMas
5d30: 74 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75  ter bytes (inclu
5d40: 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65  ding a.** nul-te
5d50: 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20  rminator), then 
5d60: 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20  this is handled 
5d70: 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20  as if no master 
5d80: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20  journal name.** 
5d90: 77 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20  were present in 
5da0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
5db0: 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
5dc0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
5dd0: 20 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74   is present at t
5de0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
5df0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74  urnal.** file, t
5e00: 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64  hen it is copied
5e10: 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72   into the buffer
5e20: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
5e30: 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c  Master. A.** nul
5e40: 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
5e50: 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20   is appended to 
5e60: 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f  the buffer follo
5e70: 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a  wing the master.
5e80: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
5e90: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  name..**.** If i
5ea0: 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  t is determined 
5eb0: 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a  that no master j
5ec0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
5ed0: 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20   is present .** 
5ee0: 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65  zMaster[0] is se
5ef0: 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
5f00: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
5f10: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
5f20: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65   occurs while re
5f30: 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a  ading from the j
5f40: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20  ournal file, an 
5f50: 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20  SQLite.** error 
5f60: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
5f70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5f80: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
5f90: 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
5fa0: 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61  pJrnl, char *zMa
5fb0: 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65  ster, u32 nMaste
5fc0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
5fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fe0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
5ff0: 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20  */.  u32 len;   
6000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6010: 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74  /* Length in byt
6020: 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  es of master jou
6030: 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  rnal name */.  i
6040: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
6050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
6060: 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  al size in bytes
6070: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   of journal file
6080: 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20   pJrnl */.  u32 
6090: 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
60a0: 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65         /* MJ che
60b0: 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64  cksum value read
60c0: 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f   from journal */
60d0: 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20  .  u32 u;       
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
60f0: 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
6100: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69  ounter */.  unsi
6110: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
6120: 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66  [8];   /* A buff
6130: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
6140: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
6150: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c   zMaster[0] = '\
6160: 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54  0';..  if( SQLIT
6170: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
6180: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a  te3OsFileSize(pJ
6190: 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c  rnl, &szJ)).   |
61a0: 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53  | szJ<16.   || S
61b0: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
61c0: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
61d0: 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29  , szJ-16, &len))
61e0: 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73  .   || len>=nMas
61f0: 74 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54  ter .   || SQLIT
6200: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
6210: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a  32bits(pJrnl, sz
6220: 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20  J-12, &cksum)). 
6230: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
6240: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52  (rc = sqlite3OsR
6250: 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69  ead(pJrnl, aMagi
6260: 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20  c, 8, szJ-8)).  
6270: 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69   || memcmp(aMagi
6280: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
6290: 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  , 8).   || SQLIT
62a0: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
62b0: 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c  te3OsRead(pJrnl,
62c0: 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73   zMaster, len, s
62d0: 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b  zJ-16-len)).  ){
62e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
62f0: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66    }..  /* See if
6300: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61   the checksum ma
6310: 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72  tches the master
6320: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f   journal name */
6330: 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65  .  for(u=0; u<le
6340: 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  n; u++){.    cks
6350: 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d  um -= zMaster[u]
6360: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75  ;.  }.  if( cksu
6370: 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  m ){.    /* If t
6380: 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73  he checksum does
6390: 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e  n't add up, then
63a0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
63b0: 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73  the disk sectors
63c0: 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  .    ** containi
63d0: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
63e0: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
63f0: 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69  s corrupted. Thi
6400: 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64  s means.    ** d
6410: 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62  efinitely roll b
6420: 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74  ack, so just ret
6430: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  urn SQLITE_OK an
6440: 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29  d report a (nul)
6450: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a  .    ** master-j
6460: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  ournal filename.
6470: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20  .    */.    len 
6480: 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  = 0;.  }.  zMast
6490: 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a  er[len] = '\0';.
64a0: 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c     .  return SQL
64b0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
64c0: 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73   Return the offs
64d0: 65 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  et of the sector
64e0: 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20   boundary at or 
64f0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20  immediately .** 
6500: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61  following the va
6510: 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a  lue in pPager->j
6520: 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d  ournalOff, assum
6530: 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a  ing a sector .**
6540: 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d   size of pPager-
6550: 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65  >sectorSize byte
6560: 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72  s..**.** i.e for
6570: 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f   a sector size o
6580: 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50  f 512:.**.**   P
6590: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
65a0: 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20           Return 
65b0: 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  value.**   -----
65c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65e0: 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20  --.**   0       
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6600: 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20    0.**   512    
6610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6620: 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20     512.**   100 
6630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6640: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32        512.**   2
6650: 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  000             
6660: 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a           2048.**
6670: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20   .*/.static i64 
6680: 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
6690: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
66a0: 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20  .  i64 offset = 
66b0: 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61  0;.  i64 c = pPa
66c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
66d0: 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20  .  if( c ){.    
66e0: 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f  offset = ((c-1)/
66f0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
6700: 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f  Pager) + 1) * JO
6710: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
6720: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ger);.  }.  asse
6730: 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e  rt( offset%JOURN
6740: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
6750: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
6760: 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20  ( offset>=c );. 
6770: 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74   assert( (offset
6780: 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -c)<JOURNAL_HDR_
6790: 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
67a0: 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d  return offset;.}
67b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
67c0: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
67d0: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
67e0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
67f0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ed..**.** This f
6800: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
6810: 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  op if the journa
6820: 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62  l file has not b
6830: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a  een written to.*
6840: 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72  * within the cur
6850: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
6860: 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e   (i.e. if Pager.
6870: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a  journalOff==0)..
6880: 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63  **.** If doTrunc
6890: 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  ate is non-zero 
68a0: 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75  or the Pager.jou
68b0: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61  rnalSizeLimit va
68c0: 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74  riable is.** set
68d0: 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e   to 0, then trun
68e0: 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  cate the journal
68f0: 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79   file to zero by
6900: 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68  tes in size. Oth
6910: 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20  erwise,.** zero 
6920: 74 68 65 20 32 38 2d 62 79 74 65 20 68 65 61 64  the 28-byte head
6930: 65 72 20 61 74 20 74 68 65 20 73 74 61 72 74 20  er at the start 
6940: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
6950: 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63  ile. In either c
6960: 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20  ase, .** if the 
6970: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
6980: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79  no-sync mode, sy
6990: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
69a0: 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ile immediately 
69b0: 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e  .** after writin
69c0: 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
69d0: 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67  it..**.** If Pag
69e0: 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  er.journalSizeLi
69f0: 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20 61 20  mit is set to a 
6a00: 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65  positive, non-ze
6a10: 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a  ro value, and.**
6a20: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74   following the t
6a30: 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72  runcation or zer
6a40: 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64 20 61  oing described a
6a50: 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66  bove the size of
6a60: 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c   the .** journal
6a70: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69   file in bytes i
6a80: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
6a90: 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  is value, then t
6aa0: 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a  runcate the.** j
6ab0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50  ournal file to P
6ac0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
6ad0: 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65  Limit bytes. The
6ae0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
6af0: 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74  es.** not need t
6b00: 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c  o be synced foll
6b10: 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61  owing this opera
6b20: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tion..**.** If a
6b30: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
6b40: 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65  s, abandon proce
6b50: 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  ssing and return
6b60: 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
6b70: 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  de..** Otherwise
6b80: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
6b90: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
6ba0: 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  t zeroJournalHdr
6bb0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
6bc0: 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b  int doTruncate){
6bd0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
6be0: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c00: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
6c10: 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ode */.  assert(
6c20: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
6c30: 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50  jfd) );.  if( pP
6c40: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6c50: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36   ){.    const i6
6c60: 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65  4 iLimit = pPage
6c70: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
6c80: 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  mit;    /* Local
6c90: 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f   cache of jsl */
6ca0: 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  ..    IOTRACE(("
6cb0: 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20  JZEROHDR %p\n", 
6cc0: 70 50 61 67 65 72 29 29 0a 20 20 20 20 69 66 28  pPager)).    if(
6cd0: 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69   doTruncate || i
6ce0: 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Limit==0 ){.    
6cf0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6d00: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
6d10: 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65  >jfd, 0);.    }e
6d20: 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69  lse{.      stati
6d30: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72  c const char zer
6d40: 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a  oHdr[28] = {0};.
6d50: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6d60: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
6d70: 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20  ->jfd, zeroHdr, 
6d80: 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c  sizeof(zeroHdr),
6d90: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
6da0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6db0: 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
6dc0: 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
6dd0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
6de0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
6df0: 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
6e00: 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  Y|pPager->sync_f
6e10: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  lags);.    }..  
6e20: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
6e30: 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nt the transacti
6e40: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20  on is committed 
6e50: 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f  but the write lo
6e60: 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74  ck .    ** is st
6e70: 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ill held on the 
6e80: 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
6e90: 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63  s a size limit c
6ea0: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20  onfigured for . 
6eb0: 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73     ** the persis
6ec0: 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  tent journal and
6ed0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6ee0: 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73  e currently cons
6ef0: 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a  umes more.    **
6f00: 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74   space than that
6f10: 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f   limit allows fo
6f20: 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e  r, truncate it n
6f30: 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  ow. There is no 
6f40: 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73  need.    ** to s
6f50: 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c  ync the file fol
6f60: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
6f70: 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
6f80: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6f90: 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20  _OK && iLimit>0 
6fa0: 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b  ){.      i64 sz;
6fb0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
6fc0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
6fd0: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b  ager->jfd, &sz);
6fe0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
6ff0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69  QLITE_OK && sz>i
7000: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
7010: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
7020: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
7030: 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  jfd, iLimit);.  
7040: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7050: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7060: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
7070: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
7080: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f  pen when this ro
7090: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
70a0: 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65   A journal.** he
70b0: 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  ader (JOURNAL_HD
70c0: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77  R_SZ bytes) is w
70d0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
70e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20  journal file at 
70f0: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c  the.** current l
7100: 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ocation..**.** T
7110: 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68  he format for th
7120: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
7130: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
7140: 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61  ** - 8 bytes: Ma
7150: 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20  gic identifying 
7160: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a  journal format..
7170: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75  ** - 4 bytes: Nu
7180: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
7190: 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d  in journal, or -
71a0: 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69  1 no-sync mode i
71b0: 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  s on..** - 4 byt
71c0: 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65  es: Random numbe
71d0: 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20  r used for page 
71e0: 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  hash..** - 4 byt
71f0: 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61  es: Initial data
7200: 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e  base page count.
7210: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53  .** - 4 bytes: S
7220: 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20  ector size used 
7230: 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  by the process t
7240: 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a  hat wrote this j
7250: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62  ournal..** - 4 b
7260: 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70  ytes: Database p
7270: 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a  age size..** .**
7280: 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f   Followed by (JO
7290: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
72a0: 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73  8) bytes of unus
72b0: 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  ed space..*/.sta
72c0: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75  tic int writeJou
72d0: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
72e0: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
72f0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
7300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7310: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
7320: 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20    char *zHeader 
7330: 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
7340: 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61  ace;  /* Tempora
7350: 72 79 20 73 70 61 63 65 20 75 73 65 64 20 74 6f  ry space used to
7360: 20 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f   build header */
7370: 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d  .  u32 nHeader =
7380: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
7390: 65 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  e;     /* Size o
73a0: 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  f buffer pointed
73b0: 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a   to by zHeader *
73c0: 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20  /.  u32 nWrite; 
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73e0: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
73f0: 20 6f 66 20 68 65 61 64 65 72 20 73 65 63 74 6f   of header secto
7400: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69  r written */.  i
7410: 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
7420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7430: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
7440: 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
7450: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
7460: 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20  jfd) );      /* 
7470: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  Journal file mus
7480: 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20  t be open. */.. 
7490: 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55   if( nHeader>JOU
74a0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
74b0: 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  er) ){.    nHead
74c0: 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  er = JOURNAL_HDR
74d0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
74e0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
74f0: 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70  are active savep
7500: 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66  oints and any of
7510: 20 74 68 65 6d 20 77 65 72 65 20 63 72 65 61 74   them were creat
7520: 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74  ed .  ** since t
7530: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a  he most recent j
7540: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61  ournal header wa
7550: 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74  s written, updat
7560: 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65  e the .  ** Page
7570: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
7580: 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77  ffset fields now
7590: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
75a0: 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
75b0: 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
75c0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
75d0: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
75e0: 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b  iHdrOffset==0 ){
75f0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
7600: 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48  Savepoint[ii].iH
7610: 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  drOffset = pPage
7620: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
7630: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
7640: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
7650: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7660: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
7670: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
7680: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74  .  /* .  ** Writ
7690: 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64  e the nRec Field
76a0: 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66   - the number of
76b0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68   page records th
76c0: 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20  at follow this. 
76d0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
76e0: 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65  er. Normally, ze
76f0: 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ro is written to
7700: 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74   this value at t
7710: 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41  his time..  ** A
7720: 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73  fter the records
7730: 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68   are added to th
7740: 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74  e journal (and t
7750: 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65  he journal synce
7760: 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66  d, .  ** if in f
7770: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20  ull-sync mode), 
7780: 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72  the zero is over
7790: 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65  written with the
77a0: 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a   true number.  *
77b0: 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65  * of records (se
77c0: 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29  e syncJournal())
77d0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61  ..  **.  ** A fa
77e0: 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65  ster alternative
77f0: 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46   is to write 0xF
7800: 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e  FFFFFFF to the n
7810: 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a  Rec field. When.
7820: 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65    ** reading the
7830: 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61   journal this va
7840: 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65  lue tells SQLite
7850: 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20   to assume that 
7860: 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66  the.  ** rest of
7870: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7880: 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64  e contains valid
7890: 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54   page records. T
78a0: 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20  his assumption. 
78b0: 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73   ** is dangerous
78c0: 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72  , as if a failur
78d0: 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73  e occurred whils
78e0: 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  t writing to the
78f0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
7900: 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69  le it may contai
7910: 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64  n some garbage d
7920: 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74  ata. There are t
7930: 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a  wo scenarios.  *
7940: 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73  * where this ris
7950: 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  k can be ignored
7960: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  :.  **.  **   * 
7970: 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69  When the pager i
7980: 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  s in no-sync mod
7990: 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61  e. Corruption ca
79a0: 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20  n follow a.  ** 
79b0: 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72      power failur
79c0: 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61  e in this case a
79d0: 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nyway..  **.  **
79e0: 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51     * When the SQ
79f0: 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
7a00: 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73  APPEND flag is s
7a10: 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74  et. This guarant
7a20: 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61  ees.  **     tha
7a30: 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69  t garbage data i
7a40: 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64  s never appended
7a50: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
7a60: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  file..  */.  ass
7a70: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
7a80: 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
7a90: 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69  r->noSync );.  i
7aa0: 66 28 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( (pPager->noSy
7ab0: 6e 63 29 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e  nc) || (pPager->
7ac0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
7ad0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
7ae0: 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71  EMORY).   || (sq
7af0: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
7b00: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
7b10: 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f  ger->fd)&SQLITE_
7b20: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
7b30: 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d  D) .  ){.    mem
7b40: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
7b50: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
7b60: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
7b70: 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74  ));.    put32bit
7b80: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
7b90: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
7ba0: 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a  ], 0xffffffff);.
7bb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 48 65    }else{.    zHe
7bc0: 61 64 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ader[0] = '\0';.
7bd0: 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
7be0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
7bf0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30  ournalMagic)], 0
7c00: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
7c10: 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61   random check-ha
7c20: 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a  sh initialiser *
7c30: 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  / .  sqlite3_ran
7c40: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70  domness(sizeof(p
7c50: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
7c60: 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  ), &pPager->cksu
7c70: 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62  mInit);.  put32b
7c80: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
7c90: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
7ca0: 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63  c)+4], pPager->c
7cb0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20  ksumInit);.  /* 
7cc0: 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61  The initial data
7cd0: 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  base size */.  p
7ce0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
7cf0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
7d00: 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67  lMagic)+8], pPag
7d10: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b  er->dbOrigSize);
7d20: 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65  .  /* The assume
7d30: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f  d sector size fo
7d40: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a  r this process *
7d50: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
7d60: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
7d70: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d  ournalMagic)+12]
7d80: 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  , pPager->sector
7d90: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  Size);..  /* The
7da0: 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
7db0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
7dc0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
7dd0: 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50  alMagic)+16], pP
7de0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
7df0: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
7e00: 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20  ing the tail of 
7e10: 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f  the buffer is no
7e20: 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76  t necessary.  Ev
7e30: 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f  erything.  ** wo
7e40: 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65 20  rks find if the 
7e50: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74  following memset
7e60: 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20  () is omitted.  
7e70: 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  But initializing
7e80: 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79  .  ** the memory
7e90: 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69   prevents valgri
7ea0: 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e  nd from complain
7eb0: 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77  ing, so we are w
7ec0: 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74  illing to.  ** t
7ed0: 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ake the performa
7ee0: 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20  nce hit..  */.  
7ef0: 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b  memset(&zHeader[
7f00: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
7f10: 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20  agic)+20], 0,.  
7f20: 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28         nHeader-(
7f30: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
7f40: 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f  agic)+20));..  /
7f50: 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74 20  * In theory, it 
7f60: 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72  is only necessar
7f70: 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 32  y to write the 2
7f80: 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68 65  8 bytes that the
7f90: 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68   .  ** journal h
7fa0: 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20 74  eader consumes t
7fb0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
7fc0: 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69 6e  le here. Then in
7fd0: 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a  crement the .  *
7fe0: 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  * Pager.journalO
7ff0: 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20 4a  ff variable by J
8000: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f  OURNAL_HDR_SZ so
8010: 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 0a   that the next .
8020: 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 77    ** record is w
8030: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 6f  ritten to the fo
8040: 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20 28  llowing sector (
8050: 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69 6e  leaving a gap in
8060: 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74   the file.  ** t
8070: 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c  hat will be impl
8080: 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e  icitly filled in
8090: 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a   by the OS)..  *
80a0: 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 69  *.  ** However i
80b0: 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63 6f  t has been disco
80c0: 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73 6f  vered that on so
80d0: 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73 20  me systems this 
80e0: 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a  pattern can .  *
80f0: 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e 74  * be significant
8100: 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20 63  ly slower than c
8110: 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69 74  ontiguously writ
8120: 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20  ing data to the 
8130: 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20  file,.  ** even 
8140: 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65 78  if that means ex
8150: 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e 67  plicitly writing
8160: 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c 6f   data to the blo
8170: 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55  ck of .  ** (JOU
8180: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
8190: 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69 6c  ) bytes that wil
81a0: 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 53  l not be used. S
81b0: 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a 20  o that is what. 
81c0: 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20   ** is done. .  
81d0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70  **.  ** The loop
81e0: 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65 72   is required her
81f0: 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 65  e in case the se
8200: 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72  ctor-size is lar
8210: 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20  ger than the .  
8220: 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ** database page
8230: 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68 65   size. Since the
8240: 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72 20   zHeader buffer 
8250: 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61  is only Pager.pa
8260: 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65  geSize.  ** byte
8270: 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20  s in size, more 
8280: 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f  than one call to
8290: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
82a0: 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72 65  ) may be require
82b0: 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61  d.  ** to popula
82c0: 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  te the entire jo
82d0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63  urnal header sec
82e0: 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72  tor..  */ .  for
82f0: 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53  (nWrite=0; rc==S
8300: 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65  QLITE_OK&&nWrite
8310: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
8320: 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b  pPager); nWrite+
8330: 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20 49  =nHeader){.    I
8340: 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
8350: 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
8360: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
8370: 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72  rnalHdr, nHeader
8380: 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
8390: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
83a0: 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
83b0: 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65 72   nHeader, pPager
83c0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
83d0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
83e0: 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72  alOff += nHeader
83f0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
8400: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
8410: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
8420: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
8430: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20  this is called. 
8440: 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  A journal header
8450: 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41   file.** (JOURNA
8460: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
8470: 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  is read from the
8480: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
8490: 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n in the journal
84a0: 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75  .** file. The cu
84b0: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69  rrent location i
84c0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
84d0: 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a  le is given by.*
84e0: 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  * pPager->journa
84f0: 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  lOff. See commen
8500: 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f  ts above functio
8510: 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  n writeJournalHd
8520: 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73  r() for.** a des
8530: 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
8540: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
8550: 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormat..**.** If 
8560: 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65  the header is re
8570: 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ad successfully,
8580: 20 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20 74   *pNRec is set t
8590: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
85a0: 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  ** page records 
85b0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68  following this h
85c0: 65 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69  eader and *pDbSi
85d0: 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
85e0: 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
85f0: 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
8600: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
8610: 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e  began, in pages.
8620: 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63   Also, pPager->c
8630: 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73  ksumInit.** is s
8640: 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
8650: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
8660: 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51  urnal header. SQ
8670: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
8680: 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ned.** in this c
8690: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
86a0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
86b0: 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f   file appears to
86c0: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53   be corrupted, S
86d0: 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a  QLITE_DONE is.**
86e0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
86f0: 4e 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a  NRec and *PDbSiz
8700: 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e  e are undefined.
8710: 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52    If JOURNAL_HDR
8720: 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e  _SZ bytes.** can
8730: 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d  not be read from
8740: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
8750: 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  e an error code 
8760: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
8770: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a  static int readJ
8780: 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67  ournalHdr(.  Pag
8790: 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
87a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
87b0: 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
87c0: 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20  nt isHot,.  i64 
87d0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20  journalSize,    
87e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
87f0: 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75   of the open jou
8800: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
8810: 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52  es */.  u32 *pNR
8820: 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ec,             
8830: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c       /* OUT: Val
8840: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
8850: 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20   nRec field */. 
8860: 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20   u32 *pDbSize   
8870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8880: 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f   OUT: Value of o
8890: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
88a0: 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29   size field */.)
88b0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
88c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88d0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
88e0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
88f0: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20  ar aMagic[8];   
8900: 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f    /* A buffer to
8910: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
8920: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20  header */.  i64 
8930: 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
8940: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
8950: 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65  et of journal he
8960: 61 64 65 72 20 62 65 69 6e 67 20 72 65 61 64 20  ader being read 
8970: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73  */..  assert( is
8980: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
8990: 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75  ) );      /* Jou
89a0: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
89b0: 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a  e open. */..  /*
89c0: 20 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a   Advance Pager.j
89d0: 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65  ournalOff to the
89e0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65   start of the ne
89f0: 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68  xt sector. If th
8a00: 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  e.  ** journal f
8a10: 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c  ile is too small
8a20: 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65   for there to be
8a30: 20 61 20 68 65 61 64 65 72 20 73 74 6f 72 65 64   a header stored
8a40: 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f   at this.  ** po
8a50: 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  int, return SQLI
8a60: 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20  TE_DONE..  */.  
8a70: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8a80: 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
8a90: 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
8aa0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
8ab0: 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f  rnalOff+JOURNAL_
8ac0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e  HDR_SZ(pPager) >
8ad0: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a   journalSize ){.
8ae0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8af0: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48  E_DONE;.  }.  iH
8b00: 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
8b10: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f  journalOff;..  /
8b20: 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 66 69  * Read in the fi
8b30: 72 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74  rst 8 bytes of t
8b40: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
8b50: 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f  r. If they do no
8b60: 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65  t match.  ** the
8b70: 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66    magic string f
8b80: 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74 61 72  ound at the star
8b90: 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61  t of each journa
8ba0: 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e  l header, return
8bb0: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  .  ** SQLITE_DON
8bc0: 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  E. If an IO erro
8bd0: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
8be0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20   an error code. 
8bf0: 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20  Otherwise,.  ** 
8c00: 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20  proceed..  */.  
8c10: 69 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64  if( isHot || iHd
8c20: 72 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f  rOff!=pPager->jo
8c30: 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20  urnalHdr ){.    
8c40: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
8c50: 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
8c60: 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  aMagic, sizeof(a
8c70: 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29  Magic), iHdrOff)
8c80: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
8c90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
8ca0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d  .    }.    if( m
8cb0: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
8cc0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
8cd0: 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20  eof(aMagic))!=0 
8ce0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8cf0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
8d00: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61   }.  }..  /* Rea
8d10: 64 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  d the first thre
8d20: 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20  e 32-bit fields 
8d30: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
8d40: 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a  eader: The nRec.
8d50: 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20    ** field, the 
8d60: 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c  checksum-initial
8d70: 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61 74  izer and the dat
8d80: 61 62 61 73 65 20 73 69 7a 65 20 61 74 20 74 68  abase size at th
8d90: 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20  e start.  ** of 
8da0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
8db0: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
8dc0: 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
8dd0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20  g goes wrong..  
8de0: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
8df0: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
8e00: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
8e10: 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52  , iHdrOff+8, pNR
8e20: 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  ec)).   || SQLIT
8e30: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
8e40: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
8e50: 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20  fd, iHdrOff+12, 
8e60: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
8e70: 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  it)).   || SQLIT
8e80: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
8e90: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
8ea0: 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20  fd, iHdrOff+16, 
8eb0: 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20  pDbSize)).  ){. 
8ec0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
8ed0: 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
8ee0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29  >journalOff==0 )
8ef0: 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67 65 53  {.    u32 iPageS
8f00: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
8f10: 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20     /* Page-size 
8f20: 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c  field of journal
8f30: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75   header */.    u
8f40: 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20  32 iSectorSize; 
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8f60: 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64  ector-size field
8f70: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
8f80: 65 72 20 2a 2f 0a 20 20 20 20 75 31 36 20 69 50  er */.    u16 iP
8f90: 61 67 65 53 69 7a 65 31 36 3b 20 20 20 20 20 20  ageSize16;      
8fa0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
8fb0: 66 20 69 50 61 67 65 53 69 7a 65 20 69 6e 20 31  f iPageSize in 1
8fc0: 36 2d 62 69 74 20 76 61 72 69 61 62 6c 65 20 2a  6-bit variable *
8fd0: 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  /..    /* Read t
8fe0: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
8ff0: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75   sector-size jou
9000: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 65 6c  rnal header fiel
9010: 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 53  ds. */.    if( S
9020: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
9030: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
9040: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
9050: 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65  20, &iSectorSize
9060: 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54  )).     || SQLIT
9070: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
9080: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
9090: 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c 20  fd, iHdrOff+24, 
90a0: 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20 20 20  &iPageSize)).   
90b0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
90c0: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
90d0: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
90e0: 65 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72  e values read fr
90f0: 6f 6d 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  om the page-size
9100: 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
9110: 20 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61   fields.    ** a
9120: 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e  re within range.
9130: 20 54 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65   To be 'in range
9140: 27 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e  ', both values n
9150: 65 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  eed to be a powe
9160: 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20  r.    ** of two 
9170: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
9180: 65 71 75 61 6c 20 74 6f 20 35 31 32 2c 20 61 6e  equal to 512, an
9190: 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68  d not greater th
91a0: 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a  an their .    **
91b0: 20 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70   respective comp
91c0: 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d  ile time maximum
91d0: 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a   limits..    */.
91e0: 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a      if( iPageSiz
91f0: 65 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20  e<512           
9200: 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f         || iSecto
9210: 72 53 69 7a 65 3c 35 31 32 0a 20 20 20 20 20 7c  rSize<512.     |
9220: 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49  | iPageSize>SQLI
9230: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
9240: 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e   || iSectorSize>
9250: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a  MAX_SECTOR_SIZE.
9260: 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53       || ((iPageS
9270: 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65  ize-1)&iPageSize
9280: 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63  )!=0   || ((iSec
9290: 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74  torSize-1)&iSect
92a0: 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20  orSize)!=0 .    
92b0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
92c0: 68 65 20 65 69 74 68 65 72 20 74 68 65 20 70 61  he either the pa
92d0: 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f  ge-size or secto
92e0: 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f  r-size in the jo
92f0: 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20  urnal-header is 
9300: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69  .      ** invali
9310: 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63  d, then the proc
9320: 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74  ess that wrote t
9330: 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  he journal-heade
9340: 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20  r must have .   
9350: 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65     ** crashed be
9360: 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 20  fore the header 
9370: 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74  was synced. In t
9380: 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65  his case stop re
9390: 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20  ading .      ** 
93a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
93b0: 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   here..      */.
93c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
93d0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
93e0: 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
93f0: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20  he page-size to 
9400: 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20  match the value 
9410: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
9420: 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55  urnal. .    ** U
9430: 73 65 20 61 20 74 65 73 74 63 61 73 65 28 29 20  se a testcase() 
9440: 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75  macro to make su
9450: 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66  re that malloc f
9460: 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20  ailure within . 
9470: 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61     ** PagerSetPa
9480: 67 65 73 69 7a 65 28 29 20 69 73 20 74 65 73 74  gesize() is test
9490: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
94a0: 50 61 67 65 53 69 7a 65 31 36 20 3d 20 28 75 31  PageSize16 = (u1
94b0: 36 29 69 50 61 67 65 53 69 7a 65 3b 0a 20 20 20  6)iPageSize;.   
94c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
94d0: 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50  erSetPagesize(pP
94e0: 61 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65  ager, &iPageSize
94f0: 31 36 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73  16, -1);.    tes
9500: 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
9510: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  E_OK );.    asse
9520: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
9530: 4b 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 31 36  K || iPageSize16
9540: 3d 3d 28 75 31 36 29 69 50 61 67 65 53 69 7a 65  ==(u16)iPageSize
9550: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61   );..    /* Upda
9560: 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73  te the assumed s
9570: 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61  ector-size to ma
9580: 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73  tch the value us
9590: 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68  ed by .    ** th
95a0: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
95b0: 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72  reated this jour
95c0: 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75  nal. If this jou
95d0: 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20  rnal was.    ** 
95e0: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
95f0: 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20  cess other than 
9600: 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74  this one, then t
9610: 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20  his routine.    
9620: 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  ** is being call
9630: 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70  ed from within p
9640: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e  ager_playback().
9650: 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   The local value
9660: 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72  .    ** of Pager
9670: 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72  .sectorSize is r
9680: 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65  estored at the e
9690: 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69  nd of that routi
96a0: 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ne..    */.    p
96b0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
96c0: 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  e = iSectorSize;
96d0: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
96e0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
96f0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
9700: 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
9710: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  c;.}.../*.** Wri
9720: 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  te the supplied 
9730: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
9740: 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ame into the jou
9750: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
9760: 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74  ger.** pPager at
9770: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
9780: 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65  ation. The maste
9790: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
97a0: 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a  ust be the last.
97b0: 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e  ** thing written
97c0: 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   to a journal fi
97d0: 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  le. If the pager
97e0: 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   is in full-sync
97f0: 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f   mode, the.** jo
9800: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
9810: 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65  iptor is advance
9820: 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  d to the next se
9830: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65  ctor boundary be
9840: 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67  fore.** anything
9850: 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65   is written. The
9860: 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a   format is:.**.*
9870: 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50  *   + 4 bytes: P
9880: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a  AGER_MJ_PGNO..**
9890: 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61     + N bytes: Ma
98a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
98b0: 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a  ename in utf-8..
98c0: 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
98d0: 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73  N (length of mas
98e0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
98f0: 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75   in bytes, no nu
9900: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a  l-terminator)..*
9910: 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d  *   + 4 bytes: M
9920: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
9930: 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  me checksum..** 
9940: 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f    + 8 bytes: aJo
9950: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
9960: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
9970: 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63  ournal page chec
9980: 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20  ksum is the sum 
9990: 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  of the bytes in 
99a0: 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  the master.** jo
99b0: 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72  urnal name, wher
99c0: 65 20 65 61 63 68 20 62 79 74 65 20 69 73 20 69  e each byte is i
99d0: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20  nterpreted as a 
99e0: 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74  signed 8-bit int
99f0: 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  eger..**.** If z
9a00: 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c  Master is a NULL
9a10: 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73   pointer (occurs
9a20: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61   for a single da
9a30: 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
9a40: 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61  on), .** this ca
9a50: 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ll is a no-op..*
9a60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
9a70: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
9a80: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
9a90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
9aa0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
9ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ac0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
9ad0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
9ae0: 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20  nMaster;        
9af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9b00: 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67  Length of string
9b10: 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36   zMaster */.  i6
9b20: 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
9b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9b40: 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64  * Offset of head
9b50: 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69  er in journal fi
9b60: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c  le */.  i64 jrnl
9b70: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
9b80: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
9b90: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   of journal file
9ba0: 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33   on disk */.  u3
9bb0: 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20  2 cksum = 0;    
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9bd0: 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74  * Checksum of st
9be0: 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  ring zMaster */.
9bf0: 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20  .  if( !zMaster 
9c00: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  || pPager->setMa
9c10: 73 74 65 72 0a 20 20 20 7c 7c 20 70 50 61 67 65  ster.   || pPage
9c20: 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
9c30: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
9c40: 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20  E_MEMORY .   || 
9c50: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
9c60: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9c70: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b  ALMODE_OFF .  ){
9c80: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9c90: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61  TE_OK;.  }.  pPa
9ca0: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
9cb0: 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   1;.  assert( is
9cc0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
9cd0: 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75  ) );..  /* Calcu
9ce0: 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20  late the length 
9cf0: 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74 68 65  in bytes and the
9d00: 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61   checksum of zMa
9d10: 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d  ster */.  for(nM
9d20: 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72  aster=0; zMaster
9d30: 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74  [nMaster]; nMast
9d40: 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d  er++){.    cksum
9d50: 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73   += zMaster[nMas
9d60: 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ter];.  }..  /* 
9d70: 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
9d80: 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
9d90: 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
9da0: 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
9db0: 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
9dc0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
9dd0: 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
9de0: 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
9df0: 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
9e00: 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
9e10: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
9e20: 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
9e30: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
9e40: 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  lSync ){.    pPa
9e50: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
9e60: 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
9e70: 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  et(pPager);.  }.
9e80: 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67    iHdrOff = pPag
9e90: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
9ea0: 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
9eb0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64  master journal d
9ec0: 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ata to the end o
9ed0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
9ee0: 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  le. If.  ** an e
9ef0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
9f00: 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
9f10: 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
9f20: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20  ..  */.  if( (0 
9f30: 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
9f40: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
9f50: 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52  , iHdrOff, PAGER
9f60: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
9f70: 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
9f80: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57  (rc = sqlite3OsW
9f90: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
9fa0: 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74  , zMaster, nMast
9fb0: 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29  er, iHdrOff+4)))
9fc0: 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
9fd0: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
9fe0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
9ff0: 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e  Off+4+nMaster, n
a000: 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20  Master))).   || 
a010: 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
a020: 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
a030: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  jfd, iHdrOff+4+n
a040: 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29  Master+4, cksum)
a050: 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
a060: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
a070: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
a080: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
a090: 38 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  8, iHdrOff+4+nMa
a0a0: 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20  ster+8))).  ){. 
a0b0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
a0c0: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
a0d0: 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74  nalOff += (nMast
a0e0: 65 72 2b 32 30 29 3b 0a 20 20 70 50 61 67 65 72  er+20);.  pPager
a0f0: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50  ->needSync = !pP
a100: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a 20  ager->noSync;.. 
a110: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
a120: 20 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74   is in peristent
a130: 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74  -journal mode, t
a140: 68 65 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c  hen the physical
a150: 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66   .  ** journal-f
a160: 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70  ile may extend p
a170: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
a180: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
a190: 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20  l name.  ** and 
a1a0: 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63  8 bytes of magic
a1b0: 20 64 61 74 61 20 6a 75 73 74 20 77 72 69 74 74   data just writt
a1c0: 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20  en to the file. 
a1d0: 54 68 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61  This is .  ** da
a1e0: 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73 65 20  ngerous because 
a1f0: 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c  the code to roll
a200: 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
a210: 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c  al file.  ** wil
a220: 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f  l not be able to
a230: 20 66 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72   find the master
a240: 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f  -journal name to
a250: 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a   determine .  **
a260: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
a270: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68  the journal is h
a280: 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  ot. .  **.  ** E
a290: 61 73 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20  asiest thing to 
a2a0: 64 6f 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61  do in this scena
a2b0: 72 69 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61  rio is to trunca
a2c0: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  te the journal .
a2d0: 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65    ** file to the
a2e0: 20 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a   required size..
a2f0: 20 20 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49    */ .  if( SQLI
a300: 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c  TE_OK==(rc = sql
a310: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
a320: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e  Pager->jfd, &jrn
a330: 6c 53 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72  lSize)).   && jr
a340: 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a  nlSize>pPager->j
a350: 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20  ournalOff.  ){. 
a360: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
a370: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
a380: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
a390: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a  ournalOff);.  }.
a3a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
a3b0: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67  /*.** Find a pag
a3c0: 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61  e in the hash ta
a3d0: 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61  ble given its pa
a3e0: 67 65 20 6e 75 6d 62 65 72 2e 20 52 65 74 75 72  ge number. Retur
a3f0: 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
a400: 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55  o the page or NU
a410: 4c 4c 20 69 66 20 74 68 65 20 72 65 71 75 65 73  LL if the reques
a420: 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20  ted page is not 
a430: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 6d  .** already in m
a440: 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
a450: 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f   PgHdr *pager_lo
a460: 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67  okup(Pager *pPag
a470: 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
a480: 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20    PgHdr *p;     
a490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4a0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
a4b0: 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20  lue */..  /* It 
a4c0: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
a4d0: 66 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20 50 63  for a call to Pc
a4e0: 61 63 68 65 46 65 74 63 68 28 29 20 77 69 74 68  acheFetch() with
a4f0: 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 30 20 74   createFlag==0 t
a500: 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e  o.  ** fail, sin
a510: 63 65 20 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f  ce no attempt to
a520: 20 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69   allocate dynami
a530: 63 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65  c memory will be
a540: 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76   made..  */.  (v
a550: 6f 69 64 29 73 71 6c 69 74 65 33 50 63 61 63 68  oid)sqlite3Pcach
a560: 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70  eFetch(pPager->p
a570: 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c  PCache, pgno, 0,
a580: 20 26 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70   &p);.  return p
a590: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  ;.}../*.** Unles
a5a0: 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  s the pager is i
a5b0: 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 64  n error-state, d
a5c0: 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65  iscard all in-me
a5d0: 6d 6f 72 79 20 70 61 67 65 73 2e 20 49 66 0a 2a  mory pages. If.*
a5e0: 2a 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  * the pager is i
a5f0: 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 74  n error-state, t
a600: 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 20 69 73  hen this call is
a610: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
a620: 54 4f 44 4f 3a 20 57 68 79 20 63 61 6e 20 77 65  TODO: Why can we
a630: 20 6e 6f 74 20 72 65 73 65 74 20 74 68 65 20 70   not reset the p
a640: 61 67 65 72 20 77 68 69 6c 65 20 69 6e 20 65 72  ager while in er
a650: 72 6f 72 20 73 74 61 74 65 3f 0a 2a 2f 0a 73 74  ror state?.*/.st
a660: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
a670: 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  reset(Pager *pPa
a680: 67 65 72 29 7b 0a 20 20 69 66 28 20 53 51 4c 49  ger){.  if( SQLI
a690: 54 45 5f 4f 4b 3d 3d 70 50 61 67 65 72 2d 3e 65  TE_OK==pPager->e
a6a0: 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 73 71  rrCode ){.    sq
a6b0: 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61  lite3BackupResta
a6c0: 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  rt(pPager->pBack
a6d0: 75 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  up);.    sqlite3
a6e0: 50 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67  PcacheClear(pPag
a6f0: 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
a700: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
a710: 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Valid = 0;.  }.}
a720: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
a730: 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74   structures in t
a740: 68 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  he Pager.aSavepo
a750: 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20  int[] array and 
a760: 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65  set both.** Page
a770: 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64  r.aSavepoint and
a780: 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e   Pager.nSavepoin
a790: 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65  t to zero. Close
a7a0: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
a7b0: 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65  .** if it is ope
a7c0: 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  n and the pager 
a7d0: 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  is not in exclus
a7e0: 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ive mode..*/.sta
a7f0: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
a800: 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61  AllSavepoints(Pa
a810: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
a820: 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
a830: 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
a840: 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68  r for looping th
a850: 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53 61 76  rough Pager.aSav
a860: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28  epoint */.  for(
a870: 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d  ii=0; ii<pPager-
a880: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
a890: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  +){.    sqlite3B
a8a0: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
a8b0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
a8c0: 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  ii].pInSavepoint
a8d0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  );.  }.  if( !pP
a8e0: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
a8f0: 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33 49 73  ode || sqlite3Is
a900: 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  MemJournal(pPage
a910: 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20  r->sjfd) ){.    
a920: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
a930: 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20  Pager->sjfd);.  
a940: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
a950: 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
a960: 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  int);.  pPager->
a970: 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  aSavepoint = 0;.
a980: 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70    pPager->nSavep
a990: 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  oint = 0;.  pPag
a9a0: 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b  er->nSubRec = 0;
a9b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
a9c0: 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e  e bit number pgn
a9d0: 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72 53 61  o in the PagerSa
a9e0: 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
a9f0: 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73  oint .** bitvecs
aa00: 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76   of all open sav
aa10: 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20  epoints. Return 
aa20: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
aa30: 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51  cessful.** or SQ
aa40: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20  LITE_NOMEM if a 
aa50: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f  malloc failure o
aa60: 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccurs..*/.static
aa70: 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f   int addToSavepo
aa80: 69 6e 74 42 69 74 76 65 63 73 28 50 61 67 65 72  intBitvecs(Pager
aa90: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
aaa0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20  gno){.  int ii; 
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aac0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
aad0: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  r */.  int rc = 
aae0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
aaf0: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
ab00: 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20  */..  for(ii=0; 
ab10: 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
ab20: 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
ab30: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
ab40: 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61   *p = &pPager->a
ab50: 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20  Savepoint[ii];. 
ab60: 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e     if( pgno<=p->
ab70: 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72  nOrig ){.      r
ab80: 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76  c |= sqlite3Bitv
ab90: 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65  ecSet(p->pInSave
aba0: 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  point, pgno);.  
abb0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
abc0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
abd0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
abe0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
abf0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
ac00: 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  M );.    }.  }. 
ac10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ac20: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
ac30: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
ac40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
ac50: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70  a no-op if the p
ac60: 61 67 65 72 0a 2a 2a 20 69 73 20 69 6e 20 65 78  ager.** is in ex
ac70: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a  clusive mode..**
ac80: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
ac90: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
aca0: 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 69   error state, di
acb0: 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e  scard the conten
acc0: 74 73 20 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61  ts of .** the ca
acd0: 63 68 65 20 61 6e 64 20 72 65 73 65 74 20 74 68  che and reset th
ace0: 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
acf0: 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
ad00: 2e 20 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a  . If there is.**
ad10: 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c   an open journal
ad20: 2d 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20  -file, then the 
ad30: 6e 65 78 74 20 74 69 6d 65 20 61 20 73 68 61 72  next time a shar
ad40: 65 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  ed-lock is obtai
ad50: 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61  ned.** on the pa
ad60: 67 65 72 20 66 69 6c 65 20 28 62 79 20 74 68 69  ger file (by thi
ad70: 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
ad80: 72 6f 63 65 73 73 29 2c 20 69 74 20 77 69 6c 6c  rocess), it will
ad90: 20 62 65 0a 2a 2a 20 74 72 65 61 74 65 64 20 61   be.** treated a
ada0: 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  s a hot-journal 
adb0: 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  and rolled back.
adc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
add0: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
ade0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
adf0: 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
ae00: 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
ae10: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ae30: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
ae40: 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 63  .    /* Always c
ae50: 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lose the journal
ae60: 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70   file when dropp
ae70: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
ae80: 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2a 20 4f 74   lock..    ** Ot
ae90: 68 65 72 77 69 73 65 2c 20 61 6e 6f 74 68 65 72  herwise, another
aea0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
aeb0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65   journal_mode=de
aec0: 6c 65 74 65 20 6d 69 67 68 74 0a 20 20 20 20 2a  lete might.    *
aed0: 2a 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c  * delete the fil
aee0: 65 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  e out from under
aef0: 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   us..    */.    
af00: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
af10: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
af20: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
af30: 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
af40: 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70  nJournal);.    p
af50: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
af60: 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  l = 0;.    relea
af70: 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
af80: 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a  pPager);..    /*
af90: 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
afa0: 75 6e 6c 6f 63 6b 65 64 2c 20 73 6f 6d 65 62 6f  unlocked, somebo
afb0: 64 79 20 65 6c 73 65 20 6d 69 67 68 74 20 63 68  dy else might ch
afc0: 61 6e 67 65 20 69 74 2e 20 54 68 65 0a 20 20 20  ange it. The.   
afd0: 20 2a 2a 20 76 61 6c 75 65 73 20 73 74 6f 72 65   ** values store
afe0: 64 20 69 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  d in Pager.dbSiz
aff0: 65 20 65 74 63 2e 20 6d 69 67 68 74 20 62 65 63  e etc. might bec
b000: 6f 6d 65 20 69 6e 76 61 6c 69 64 20 69 66 0a 20  ome invalid if. 
b010: 20 20 20 2a 2a 20 74 68 69 73 20 68 61 70 70 65     ** this happe
b020: 6e 73 2e 20 54 4f 44 4f 3a 20 52 65 61 6c 6c 79  ns. TODO: Really
b030: 2c 20 74 68 69 73 20 64 6f 65 73 6e 27 74 20 6e  , this doesn't n
b040: 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65  eed to be cleare
b050: 64 0a 20 20 20 20 2a 2a 20 75 6e 74 69 6c 20 74  d.    ** until t
b060: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
b070: 72 20 63 68 65 63 6b 20 66 61 69 6c 73 20 69 6e  r check fails in
b080: 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b   PagerSharedLock
b090: 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ()..    */.    p
b0a0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
b0b0: 69 64 20 3d 20 30 3b 0a 0a 20 20 20 20 72 63 20  id = 0;..    rc 
b0c0: 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  = osUnlock(pPage
b0d0: 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
b0e0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
b0f0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
b100: 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 7d  Code = rc;.    }
b110: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55  .    IOTRACE(("U
b120: 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61  NLOCK %p\n", pPa
b130: 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a 20 49 66  ger))..    /* If
b140: 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69   Pager.errCode i
b150: 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65  s set, the conte
b160: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
b170: 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65   cache cannot be
b180: 0a 20 20 20 20 2a 2a 20 74 72 75 73 74 65 64 2e  .    ** trusted.
b190: 20 4e 6f 77 20 74 68 61 74 20 74 68 65 20 70 61   Now that the pa
b1a0: 67 65 72 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  ger file is unlo
b1b0: 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e  cked, the conten
b1c0: 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ts of the.    **
b1d0: 20 63 61 63 68 65 20 63 61 6e 20 62 65 20 64 69   cache can be di
b1e0: 73 63 61 72 64 65 64 20 61 6e 64 20 74 68 65 20  scarded and the 
b1f0: 65 72 72 6f 72 20 63 6f 64 65 20 73 61 66 65 6c  error code safel
b200: 79 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a  y cleared..    *
b210: 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
b220: 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
b230: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
b240: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
b250: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
b260: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
b270: 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65 72     }.      pager
b280: 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
b290: 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65      }..    pPage
b2a0: 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
b2b0: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ne = 0;.    pPag
b2c0: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
b2d0: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a 7d 0a  R_UNLOCK;.  }.}.
b2e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
b2f0: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 63  tion should be c
b300: 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4f  alled when an IO
b310: 45 52 52 2c 20 43 4f 52 52 55 50 54 20 6f 72 20  ERR, CORRUPT or 
b320: 46 55 4c 4c 20 65 72 72 6f 72 0a 2a 2a 20 6d 61  FULL error.** ma
b330: 79 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 2e  y have occurred.
b340: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
b350: 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
b360: 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 0a 2a   to the pager .*
b370: 2a 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65  * structure, the
b380: 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f   second the erro
b390: 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20  r-code about to 
b3a0: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  be returned by a
b3b0: 20 70 61 67 65 72 20 0a 2a 2a 20 41 50 49 20 66   pager .** API f
b3c0: 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 76 61 6c  unction. The val
b3d0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61  ue returned is a
b3e0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63   copy of the sec
b3f0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a  ond argument .**
b400: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
b410: 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  n. .**.** If the
b420: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
b430: 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   is SQLITE_IOERR
b440: 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  , SQLITE_CORRUPT
b450: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  , or SQLITE_FULL
b460: 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62 65  .** the error be
b470: 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e 74  comes persistent
b480: 2e 20 55 6e 74 69 6c 20 74 68 65 20 70 65 72 73  . Until the pers
b490: 69 73 74 65 6e 20 65 72 72 6f 72 20 69 73 20 63  isten error is c
b4a0: 6c 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62 73 65  leared,.** subse
b4b0: 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73 20  quent API calls 
b4c0: 6f 6e 20 74 68 69 73 20 50 61 67 65 72 20 77 69  on this Pager wi
b4d0: 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72  ll immediately r
b4e0: 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 0a  eturn the same .
b4f0: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  ** error code..*
b500: 2a 0a 2a 2a 20 41 20 70 65 72 73 69 73 74 65 6e  *.** A persisten
b510: 74 20 65 72 72 6f 72 20 69 6e 64 69 63 61 74 65  t error indicate
b520: 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  s that the conte
b530: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
b540: 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f  -cache .** canno
b550: 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 54 68  t be trusted. Th
b560: 69 73 20 73 74 61 74 65 20 63 61 6e 20 62 65 20  is state can be 
b570: 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c  cleared by compl
b580: 65 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67  etely discarding
b590: 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74   .** the content
b5a0: 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63  s of the pager-c
b5b0: 61 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73  ache. If a trans
b5c0: 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76  action was activ
b5d0: 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65  e when.** the pe
b5e0: 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f  rsistent error o
b5f0: 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68  ccurred, then th
b600: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
b610: 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74  al may need.** t
b620: 6f 20 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f  o be replayed to
b630: 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e   restore the con
b640: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74  tents of the dat
b650: 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 69  abase file (as i
b660: 66 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68  f.** it were a h
b670: 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a  ot-journal)..*/.
b680: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
b690: 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50  _error(Pager *pP
b6a0: 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20  ager, int rc){. 
b6b0: 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20   int rc2 = rc & 
b6c0: 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 0a  0xff;.  assert(.
b6d0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
b6e0: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
b6f0: 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50  ULL ||.       pP
b700: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
b710: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20  QLITE_OK ||.    
b720: 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43     (pPager->errC
b730: 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c  ode & 0xff)==SQL
b740: 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20  ITE_IOERR.  );. 
b750: 20 69 66 28 0a 20 20 20 20 72 63 32 3d 3d 53 51   if(.    rc2==SQ
b760: 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20  LITE_FULL ||.   
b770: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   rc2==SQLITE_IOE
b780: 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53  RR ||.    rc2==S
b790: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a 20 20  QLITE_CORRUPT.  
b7a0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
b7b0: 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20  rrCode = rc;.   
b7c0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
b7d0: 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
b7e0: 20 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65   .     && sqlite
b7f0: 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
b800: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
b810: 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  ==0 .    ){.    
b820: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
b830: 72 20 69 73 20 61 6c 72 65 61 64 79 20 75 6e 6c  r is already unl
b840: 6f 63 6b 65 64 2c 20 63 61 6c 6c 20 70 61 67 65  ocked, call page
b850: 72 5f 75 6e 6c 6f 63 6b 28 29 20 6e 6f 77 20 74  r_unlock() now t
b860: 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 72  o.      ** clear
b870: 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
b880: 20 61 6e 64 20 65 6e 73 75 72 65 20 74 68 61 74   and ensure that
b890: 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
b8a0: 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f   is .      ** co
b8b0: 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a  mpletely empty..
b8c0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
b8d0: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
b8e0: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
b8f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b900: 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72  *.** Execute a r
b910: 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61  ollback if a tra
b920: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
b930: 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  ve and unlock th
b940: 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  e .** database f
b950: 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ile. .**.** If t
b960: 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72  he pager has alr
b970: 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65  eady entered the
b980: 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f   error state, do
b990: 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a   not attempt .**
b9a0: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74   the rollback at
b9b0: 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74   this time. Inst
b9c0: 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63  ead, pager_unloc
b9d0: 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54  k() is called. T
b9e0: 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61  he.** call to pa
b9f0: 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c  ger_unlock() wil
ba00: 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e  l discard all in
ba10: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75  -memory pages, u
ba20: 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74  nlock.** the dat
ba30: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 63  abase file and c
ba40: 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73  lear the error s
ba50: 74 61 74 65 2e 20 49 66 20 74 68 69 73 20 6d 65  tate. If this me
ba60: 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 72  ans that.** ther
ba70: 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  e is a hot-journ
ba80: 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  al left in the f
ba90: 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20  ile-system, the 
baa0: 6e 65 78 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  next connection.
bab0: 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73  ** to obtain a s
bac0: 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
bad0: 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d  e pager (which m
bae0: 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20  ay be this one) 
baf0: 77 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20 69 74 20  will.** roll it 
bb00: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
bb10: 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74  he pager has not
bb20: 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
bb30: 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
bb40: 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a  , but an IO or.*
bb50: 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  * malloc error o
bb60: 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72  ccurs during a r
bb70: 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68  ollback, then th
bb80: 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63  is will itself c
bb90: 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67  ause .** the pag
bba0: 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
bbb0: 65 72 72 6f 72 20 73 74 61 74 65 2e 20 57 68 69  error state. Whi
bbc0: 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72  ch will be clear
bbd0: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c  ed by the.** cal
bbe0: 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
bbf0: 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65  k(), as describe
bc00: 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74  d above..*/.stat
bc10: 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
bc20: 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
bc30: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
bc40: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
bc50: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
bc60: 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  && pPager->state
bc70: 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
bc80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
bc90: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
bca0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ();.    sqlite3P
bcb0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61  agerRollback(pPa
bcc0: 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ger);.    sqlite
bcd0: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
bce0: 28 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f  ();.  }.  pager_
bcf0: 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
bd00: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
bd10: 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61  utine ends a tra
bd20: 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e  nsaction. A tran
bd30: 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c  saction is usual
bd40: 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20  ly ended by .** 
bd50: 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20  either a COMMIT 
bd60: 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70  or a ROLLBACK op
bd70: 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f  eration. This ro
bd80: 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c  utine may be cal
bd90: 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f  led .** after ro
bda0: 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d  llback of a hot-
bdb0: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61  journal, or if a
bdc0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
bdd0: 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20  hile opening.** 
bde0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
bdf0: 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
be00: 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e  very first journ
be10: 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a  al-header of a.*
be20: 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  * database trans
be30: 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49  action..** .** I
be40: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
be50: 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6f  n PAGER_SHARED o
be60: 72 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73  r PAGER_UNLOCK s
be70: 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
be80: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
be90: 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
bea0: 6f 70 20 28 72 65 74 75 72 6e 73 20 53 51 4c 49  op (returns SQLI
beb0: 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  TE_OK)..**.** Ot
bec0: 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74  herwise, any act
bed0: 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
bee0: 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  re released..**.
bef0: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
bf00: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20  l file is open, 
bf10: 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61  then it is "fina
bf20: 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a  lized". Once a j
bf30: 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20  ournal .** file 
bf40: 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
bf50: 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  ed it is not pos
bf60: 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20  sible to use it 
bf70: 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a  to roll back a .
bf80: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
bf90: 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63  Nor will it be c
bfa0: 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
bfb0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79  a hot-journal by
bfc0: 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20   this.** or any 
bfd0: 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
bfe0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74  onnection. Exact
bff0: 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c  ly how a journal
c000: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a   is finalized.**
c010: 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
c020: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70  her or not the p
c030: 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
c040: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
c050: 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72  e and.** the cur
c060: 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64  rent journal-mod
c070: 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  e (Pager.journal
c080: 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20  Mode value), as 
c090: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
c0a0: 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45   journalMode==ME
c0b0: 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  MORY.**     Jour
c0c0: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
c0d0: 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c  tor is simply cl
c0e0: 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72  osed. This destr
c0f0: 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69  oys an .**     i
c100: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
c110: 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
c120: 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a  lMode==TRUNCATE.
c130: 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
c140: 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
c150: 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
c160: 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  n size..**.**   
c170: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
c180: 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20  SIST.**     The 
c190: 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f  first 28 bytes o
c1a0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
c1b0: 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54  le are zeroed. T
c1c0: 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a  his invalidates.
c1d0: 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74  **     the first
c1e0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
c1f0: 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64  in the file, and
c200: 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72   hence the entir
c210: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
c220: 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69   file. An invali
c230: 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  d journal file c
c240: 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20  annot be rolled 
c250: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  back..**.**   jo
c260: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54  urnalMode==DELET
c270: 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75  E.**     The jou
c280: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  rnal file is clo
c290: 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20  sed and deleted 
c2a0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
c2b0: 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20  elete()..**.**  
c2c0: 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20     If the pager 
c2d0: 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
c2e0: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
c2f0: 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e  is method of fin
c300: 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74  alizing.**     t
c310: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c320: 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49  is never used. I
c330: 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a  nstead, if the j
c340: 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a  ournalMode is.**
c350: 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20       DELETE and 
c360: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
c370: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
c380: 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72  the method descr
c390: 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20  ibed under.**   
c3a0: 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
c3b0: 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69  ERSIST is used i
c3c0: 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66  nstead..**.** Af
c3d0: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
c3e0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 69 66  is finalized, if
c3f0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d   running in non-
c400: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
c410: 74 68 65 0a 2a 2a 20 70 61 67 65 72 20 6d 6f 76  the.** pager mov
c420: 65 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  es to PAGER_SHAR
c430: 45 44 20 73 74 61 74 65 20 28 61 6e 64 20 64 6f  ED state (and do
c440: 77 6e 67 72 61 64 65 73 20 74 68 65 20 6c 6f 63  wngrades the loc
c450: 6b 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  k on the.** data
c460: 62 61 73 65 20 66 69 6c 65 20 61 63 63 6f 72 64  base file accord
c470: 69 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ingly)..**.** If
c480: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
c490: 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
c4a0: 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 73 20 69  ve mode and is i
c4b0: 6e 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 73  n PAGER_SYNCED s
c4c0: 74 61 74 65 2c 0a 2a 2a 20 69 74 20 6d 6f 76 65  tate,.** it move
c4d0: 73 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55  s to PAGER_EXCLU
c4e0: 53 49 56 45 2e 20 4e 6f 20 6c 6f 63 6b 73 20 61  SIVE. No locks a
c4f0: 72 65 20 64 6f 77 6e 67 72 61 64 65 64 20 77 68  re downgraded wh
c500: 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 0a 2a 2a  en running in.**
c510: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
c520: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
c530: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
c540: 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  no error occurs.
c550: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
c560: 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e  urs during.** an
c570: 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72  y of the IO oper
c580: 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69  ations to finali
c590: 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
c5a0: 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68  ile or unlock th
c5b0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68  e.** database th
c5c0: 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
c5d0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
c5e0: 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66   to the user. If
c5f0: 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69   the .** operati
c600: 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  on to finalize t
c610: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c620: 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20  fails, then the 
c630: 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72  code still.** tr
c640: 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ies to unlock th
c650: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
c660: 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  if not in exclus
c670: 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  ive mode. If the
c680: 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61  .** unlock opera
c690: 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65  tion fails as we
c6a0: 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ll, then the fir
c6b0: 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  st error code re
c6c0: 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  lated.** to the 
c6d0: 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f  first error enco
c6e0: 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75  untered (the jou
c6f0: 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f  rnal finalizatio
c700: 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74  n one) is.** ret
c710: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
c720: 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74   int pager_end_t
c730: 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
c740: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61   *pPager, int ha
c750: 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  sMaster){.  int 
c760: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
c770: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
c780: 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  de from journal 
c790: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65  finalization ope
c7a0: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
c7b0: 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
c7c0: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
c7d0: 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20  de from db file 
c7e0: 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
c7f0: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65   */..  if( pPage
c800: 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
c810: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
c820: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c830: 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 41 6c  .  }.  releaseAl
c840: 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67  lSavepoints(pPag
c850: 65 72 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  er);..  assert( 
c860: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
c870: 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  fd) || pPager->p
c880: 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
c890: 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
c8a0: 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 0a 20 20  ger->jfd) ){..  
c8b0: 20 20 2f 2a 20 54 4f 44 4f 3a 20 54 68 65 72 65    /* TODO: There
c8c0: 27 73 20 61 20 70 72 6f 62 6c 65 6d 20 68 65 72  's a problem her
c8d0: 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 66  e if a journal-f
c8e0: 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 69  ile was opened i
c8f0: 6e 20 4d 45 4d 4f 52 59 0a 20 20 20 20 2a 2a 20  n MEMORY.    ** 
c900: 6d 6f 64 65 20 61 6e 64 20 74 68 65 6e 20 74 68  mode and then th
c910: 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69  e journal-mode i
c920: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 52 55  s changed to TRU
c930: 4e 43 41 54 45 20 6f 72 20 50 45 52 53 49 53 54  NCATE or PERSIST
c940: 0a 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74  .    ** during t
c950: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
c960: 54 68 69 73 20 63 6f 64 65 20 73 68 6f 75 6c 64  This code should
c970: 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61   be changed to a
c980: 73 73 75 6d 65 0a 20 20 20 20 2a 2a 20 74 68 61  ssume.    ** tha
c990: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f  t the journal mo
c9a0: 64 65 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67  de has not chang
c9b0: 65 64 20 73 69 6e 63 65 20 74 68 65 20 74 72 61  ed since the tra
c9c0: 6e 73 61 63 74 69 6f 6e 20 77 61 73 0a 20 20 20  nsaction was.   
c9d0: 20 2a 2a 20 73 74 61 72 74 65 64 2e 20 41 6e 64   ** started. And
c9e0: 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
c9f0: 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 29 20 66  rJournalMode() f
ca00: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  unction should b
ca10: 65 0a 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 64  e.    ** changed
ca20: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
ca30: 61 74 20 74 68 69 73 20 69 73 20 74 68 65 20 63  at this is the c
ca40: 61 73 65 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a  ase too..    */.
ca50: 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65  .    /* Finalize
ca60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
ca70: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  e. */.    if( pP
ca80: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
ca90: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
caa0: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
cab0: 20 20 20 20 20 69 6e 74 20 69 73 4d 65 6d 6f 72       int isMemor
cac0: 79 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  yJournal = sqlit
cad0: 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
cae0: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
caf0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
cb00: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
cb10: 20 20 20 20 20 20 69 66 28 20 21 69 73 4d 65 6d        if( !isMem
cb20: 6f 72 79 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  oryJournal ){.  
cb30: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
cb40: 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
cb50: 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
cb60: 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
cb70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
cb80: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
cb90: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
cba0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
cbb0: 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66  CATE ){.      if
cbc0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
cbd0: 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lOff==0 ){.     
cbe0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
cbf0: 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
cc00: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
cc10: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
cc20: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a  Pager->jfd, 0);.
cc30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
cc40: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
cc50: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
cc60: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
cc70: 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ed = 0;.    }els
cc80: 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78  e if( pPager->ex
cc90: 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20  clusiveMode .   
cca0: 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
ccb0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
ccc0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
ccd0: 49 53 54 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  IST.    ){.     
cce0: 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61   rc = zeroJourna
ccf0: 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61 73  lHdr(pPager, has
cd00: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70  Master);.      p
cd10: 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
cd20: 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 70 50  r, rc);.      pP
cd30: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
cd40: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
cd50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
cd60: 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ed = 0;.    }els
cd70: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
cd80: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
cd90: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
cda0: 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 29  NALMODE_DELETE )
cdb0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
cdc0: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
cdd0: 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  fd);.      if( !
cde0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
cdf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
ce00: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
ce10: 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
ce20: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
ce30: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
ce40: 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
ce50: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
ce60: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49    sqlite3PcacheI
ce70: 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67  terateDirty(pPag
ce80: 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67  er->pPCache, pag
ce90: 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29  er_set_pagehash)
cea0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 71  ;.#endif..    sq
ceb0: 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e  lite3PcacheClean
cec0: 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61  All(pPager->pPCa
ced0: 63 68 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  che);.    sqlite
cee0: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
cef0: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
cf00: 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  l);.    pPager->
cf10: 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
cf20: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
cf30: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28   = 0;.  }..  if(
cf40: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
cf50: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72  iveMode ){.    r
cf60: 63 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50  c2 = osUnlock(pP
cf70: 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44  ager->fd, SHARED
cf80: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67  _LOCK);.    pPag
cf90: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
cfa0: 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 70 50  R_SHARED;.    pP
cfb0: 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
cfc0: 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  tDone = 0;.  }el
cfd0: 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  se if( pPager->s
cfe0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43  tate==PAGER_SYNC
cff0: 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  ED ){.    pPager
d000: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
d010: 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20  EXCLUSIVE;.  }. 
d020: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
d030: 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  er = 0;.  pPager
d040: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
d050: 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69    pPager->dbModi
d060: 66 69 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  fied = 0;..  /* 
d070: 54 4f 44 4f 3a 20 49 73 20 74 68 69 73 20 6f 70  TODO: Is this op
d080: 74 69 6d 61 6c 3f 20 57 68 79 20 69 73 20 74 68  timal? Why is th
d090: 65 20 64 62 20 73 69 7a 65 20 69 6e 76 61 6c 69  e db size invali
d0a0: 64 61 74 65 64 20 68 65 72 65 20 0a 20 20 2a 2a  dated here .  **
d0b0: 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   when the databa
d0c0: 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 75  se file is not u
d0d0: 6e 6c 6f 63 6b 65 64 3f 20 2a 2f 0a 20 20 70 50  nlocked? */.  pP
d0e0: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
d0f0: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50   = 0;.  sqlite3P
d100: 63 61 63 68 65 54 72 75 6e 63 61 74 65 28 70 50  cacheTruncate(pP
d110: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
d120: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
d130: 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
d140: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
d150: 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d  zeValid = 0;.  }
d160: 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
d170: 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63  SQLITE_OK?rc2:rc
d180: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  );.}../*.** Para
d190: 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75 73 74  meter aData must
d1a0: 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
d1b0: 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61  er of pPager->pa
d1c0: 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20  geSize bytes.** 
d1d0: 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65  of data. Compute
d1e0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68   and return a ch
d1f0: 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74  ecksum based ont
d200: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
d210: 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66   the .** page of
d220: 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 63 75   data and the cu
d230: 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70  rrent value of p
d240: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
d250: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
d260: 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b  not a real check
d270: 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c  sum. It is reall
d280: 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f  y just the sum o
d290: 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d  f the .** random
d2a0: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28   initial value (
d2b0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
d2c0: 74 29 20 61 6e 64 20 65 76 65 72 79 20 32 30 30  t) and every 200
d2d0: 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68  th byte.** of th
d2e0: 65 20 70 61 67 65 20 64 61 74 61 2c 20 73 74 61  e page data, sta
d2f0: 72 74 69 6e 67 20 77 69 74 68 20 62 79 74 65 20  rting with byte 
d300: 6f 66 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e  offset (pPager->
d310: 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a  pageSize%200)..*
d320: 2a 20 45 61 63 68 20 62 79 74 65 20 69 73 20 69  * Each byte is i
d330: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e  nterpreted as an
d340: 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20   8-bit unsigned 
d350: 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43  integer..**.** C
d360: 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d  hanging the form
d370: 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  ula used to comp
d380: 75 74 65 20 74 68 69 73 20 63 68 65 63 6b 73 75  ute this checksu
d390: 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a  m results in an.
d3a0: 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  ** incompatible 
d3b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
d3c0: 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f  mat..**.** If jo
d3d0: 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e  urnal corruption
d3e0: 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61   occurs due to a
d3f0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
d400: 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20  the most likely 
d410: 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20  .** scenario is 
d420: 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20  that one end or 
d430: 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
d440: 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20   record will be 
d450: 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20  changed. .** It 
d460: 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b  is much less lik
d470: 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f  ely that the two
d480: 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75   ends of the jou
d490: 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c  rnal record will
d4a0: 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61   be.** correct a
d4b0: 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65  nd the middle be
d4c0: 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c   corrupt.  Thus,
d4d0: 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22   this "checksum"
d4e0: 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75   scheme,.** thou
d4f0: 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70  gh fast and simp
d500: 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20  le, catches the 
d510: 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69  mostly likely ki
d520: 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e  nd of corruption
d530: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
d540: 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65  pager_cksum(Page
d550: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
d560: 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75   u8 *aData){.  u
d570: 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65  32 cksum = pPage
d580: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  r->cksumInit;   
d590: 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
d5a0: 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72  m value to retur
d5b0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70  n */.  int i = p
d5c0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d  Pager->pageSize-
d5d0: 32 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  200;          /*
d5e0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
d5f0: 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b  .  while( i>0 ){
d600: 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44  .    cksum += aD
d610: 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d  ata[i];.    i -=
d620: 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   200;.  }.  retu
d630: 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a  rn cksum;.}../*.
d640: 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  ** Read a single
d650: 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65   page from eithe
d660: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
d670: 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e  le (if isMainJrn
d680: 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d  l==1) or.** from
d690: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
d6a0: 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d   (if isMainJrnl=
d6b0: 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b  =0) and playback
d6c0: 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54   that page..** T
d6d0: 68 65 20 70 61 67 65 20 62 65 67 69 6e 73 20 61  he page begins a
d6e0: 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65  t offset *pOffse
d6f0: 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  t into the file.
d700: 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a   The *pOffset.**
d710: 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61   value is increa
d720: 73 65 64 20 74 6f 20 74 68 65 20 73 74 61 72 74  sed to the start
d730: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
d740: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
d750: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 4d 61  ..**.** The isMa
d760: 69 6e 4a 72 6e 6c 20 66 6c 61 67 20 69 73 20 74  inJrnl flag is t
d770: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 74  rue if this is t
d780: 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
d790: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20   journal and.** 
d7a0: 66 61 6c 73 65 20 66 6f 72 20 74 68 65 20 73 74  false for the st
d7b0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
d7c0: 20 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62    The main rollb
d7d0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73  ack journal uses
d7e0: 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 73 20 2d 20  .** checksums - 
d7f0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
d800: 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 2e 0a  urnal does not..
d810: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
d820: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
d830: 70 61 67 65 20 72 65 63 6f 72 64 20 72 65 61 64  page record read
d840: 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
d850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
d860: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
d870: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
d880: 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a  e of Pager.dbSiz
d890: 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b  e, then playback
d8a0: 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61   is.** skipped a
d8b0: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  nd SQLITE_OK is 
d8c0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
d8d0: 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20  If pDone is not 
d8e0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73  NULL, then it is
d8f0: 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67   a record of pag
d900: 65 73 20 74 68 61 74 20 68 61 76 65 20 61 6c 72  es that have alr
d910: 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61  eady.** been pla
d920: 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68  yed back.  If th
d930: 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73  e page at *pOffs
d940: 65 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  et has already b
d950: 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a  een played back.
d960: 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72 65  ** (if the corre
d970: 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62  sponding pDone b
d980: 69 74 20 69 73 20 73 65 74 29 20 74 68 65 6e 20  it is set) then 
d990: 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61 63  skip the playbac
d9a0: 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  k..** Make sure 
d9b0: 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f  the pDone bit co
d9c0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
d9d0: 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65  he *pOffset page
d9e0: 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72   is set.** prior
d9f0: 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a   to returning..*
da00: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
da10: 20 72 65 63 6f 72 64 20 69 73 20 73 75 63 63 65   record is succe
da20: 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f  ssfully read fro
da30: 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
da40: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20  nal file.** and 
da50: 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65  played back, the
da60: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  n SQLITE_OK is r
da70: 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
da80: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a  O error occurs.*
da90: 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  * while reading 
daa0: 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20  the record from 
dab0: 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
dac0: 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20  l file or while 
dad0: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68  writing.** to th
dae0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
daf0: 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
db00: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
db10: 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20  ned. If data.** 
db20: 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
db30: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
db40: 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
db50: 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f 20   but appears to 
db60: 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c  be.** corrupted,
db70: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
db80: 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69  returned. Data i
db90: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72  s considered cor
dba0: 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f  rupted in.** two
dbb0: 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a   circumstances:.
dbc0: 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  ** .**   * If th
dbd0: 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75  e record page-nu
dbe0: 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20  mber is illegal 
dbf0: 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50  (0 or PAGER_MJ_P
dc00: 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20  GNO), or.**   * 
dc10: 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  If the record is
dc20: 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
dc30: 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
dc40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
dc50: 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 68 65       and the che
dc60: 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73  cksum field does
dc70: 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72   not match the r
dc80: 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a  ecord content..*
dc90: 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20  *.** Neither of 
dca0: 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72  these two scenar
dcb0: 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65  ios are possible
dcc0: 20 64 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f   during a savepo
dcd0: 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  int rollback..**
dce0: 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61  .** If this is a
dcf0: 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
dd00: 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79  ack, then memory
dd10: 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65 20   may have to be 
dd20: 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61  dynamically.** a
dd30: 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
dd40: 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68   function. If th
dd50: 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20 61  is is the case a
dd60: 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  nd an allocation
dd70: 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54   fails,.** SQLIT
dd80: 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
dd90: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
dda0: 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
ddb0: 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61  k_one_page(.  Pa
ddc0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
dde0: 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20 70  he pager being p
ddf0: 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20  layed back */.  
de00: 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20  int isMainJrnl, 
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
de20: 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e   1 -> main journ
de30: 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75  al. 0 -> sub-jou
de40: 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69  rnal. */.  int i
de50: 73 55 6e 73 79 6e 63 2c 20 20 20 20 20 20 20 20  sUnsync,        
de60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
de70: 20 69 66 20 72 65 61 64 69 6e 67 20 66 72 6f 6d   if reading from
de80: 20 75 6e 73 79 6e 63 65 64 20 6d 61 69 6e 20 6a   unsynced main j
de90: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
dea0: 2a 70 4f 66 66 73 65 74 2c 20 20 20 20 20 20 20  *pOffset,       
deb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
dec0: 73 65 74 20 6f 66 20 72 65 63 6f 72 64 20 74 6f  set of record to
ded0: 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20 69   playback */.  i
dee0: 6e 74 20 69 73 53 61 76 65 70 6e 74 2c 20 20 20  nt isSavepnt,   
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
df00: 54 72 75 65 20 66 6f 72 20 61 20 73 61 76 65 70  True for a savep
df10: 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  oint rollback */
df20: 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65  .  Bitvec *pDone
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df40: 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61   /* Bitvec of pa
df50: 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79  ges already play
df60: 65 64 20 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20  ed back */.){.  
df70: 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
df80: 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
df90: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
dfa0: 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
dfb0: 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67  he cache */.  Pg
dfc0: 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
dfd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
dfe0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
dff0: 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72  f a page in jour
e000: 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
e010: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
e020: 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
e030: 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69  um used for sani
e040: 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ty checking */. 
e050: 20 75 38 20 2a 61 44 61 74 61 3b 20 20 20 20 20   u8 *aData;     
e060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e070: 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  * Temporary stor
e080: 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  age for the page
e090: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
e0a0: 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20  le *jfd;        
e0b0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
e0c0: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
e0d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
e0e0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28 69  */..  assert( (i
e0f0: 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30  sMainJrnl&~1)==0
e100: 20 29 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d 61   );      /* isMa
e110: 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20 31  inJrnl is 0 or 1
e120: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 69   */.  assert( (i
e130: 73 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20  sSavepnt&~1)==0 
e140: 29 3b 20 20 20 20 20 20 20 2f 2a 20 69 73 53 61  );       /* isSa
e150: 76 65 70 6e 74 20 69 73 20 30 20 6f 72 20 31 20  vepnt is 0 or 1 
e160: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4d  */.  assert( isM
e170: 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65  ainJrnl || pDone
e180: 20 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65   );     /* pDone
e190: 20 61 6c 77 61 79 73 20 75 73 65 64 20 6f 6e 20   always used on 
e1a0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a  sub-journals */.
e1b0: 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76 65    assert( isSave
e1c0: 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20  pnt || pDone==0 
e1d0: 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65  );   /* pDone ne
e1e0: 76 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d  ver used on non-
e1f0: 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20  savepoint */..  
e200: 61 44 61 74 61 20 3d 20 28 75 38 2a 29 70 50 61  aData = (u8*)pPa
e210: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
e220: 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20    assert( aData 
e230: 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  );         /* Te
e240: 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20  mp storage must 
e250: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
e260: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a  n allocated */..
e270: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61    /* Read the pa
e280: 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61  ge number and pa
e290: 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ge data from the
e2a0: 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d   journal or sub-
e2b0: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
e2c0: 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  e. Return an err
e2d0: 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
e2e0: 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65  aller if an IO e
e2f0: 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a  rror occurs..  *
e300: 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e  /.  jfd = isMain
e310: 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a  Jrnl ? pPager->j
e320: 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66  fd : pPager->sjf
e330: 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  d;.  rc = read32
e340: 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73  bits(jfd, *pOffs
e350: 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66  et, &pgno);.  if
e360: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e370: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
e380: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
e390: 64 28 6a 66 64 2c 20 61 44 61 74 61 2c 20 70 50  d(jfd, aData, pP
e3a0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
e3b0: 28 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20  (*pOffset)+4);. 
e3c0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e3d0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
e3e0: 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70 50    *pOffset += pP
e3f0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b  ager->pageSize +
e400: 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a   4 + isMainJrnl*
e410: 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20  4;..  /* Sanity 
e420: 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20  checking on the 
e430: 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d  page.  This is m
e440: 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ore important th
e450: 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a  at I originally.
e460: 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49    ** thought.  I
e470: 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  f a power failur
e480: 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  e occurs while t
e490: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
e4a0: 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a  ing written,.  *
e4b0: 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65  * it could cause
e4c0: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f   invalid data to
e4d0: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
e4e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57   the journal.  W
e4f0: 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64  e need to.  ** d
e500: 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c  etect this inval
e510: 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69  id data (with hi
e520: 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20  gh probability) 
e530: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20  and ignore it.. 
e540: 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   */.  if( pgno==
e550: 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  0 || pgno==PAGER
e560: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
e570: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
e580: 21 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20  !isSavepnt );.  
e590: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e5a0: 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  DONE;.  }.  if( 
e5b0: 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65  pgno>(Pgno)pPage
e5c0: 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c  r->dbSize || sql
e5d0: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
e5e0: 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20  Done, pgno) ){. 
e5f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e600: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  _OK;.  }.  if( i
e610: 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20  sMainJrnl ){.   
e620: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
e630: 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74 29  (jfd, (*pOffset)
e640: 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20  -4, &cksum);.   
e650: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
e660: 20 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69 73   rc;.    if( !is
e670: 53 61 76 65 70 6e 74 20 26 26 20 70 61 67 65 72  Savepnt && pager
e680: 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 61  _cksum(pPager, a
e690: 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a  Data)!=cksum ){.
e6a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
e6b0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
e6c0: 20 20 7d 0a 0a 20 20 69 66 28 20 70 44 6f 6e 65    }..  if( pDone
e6d0: 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65   && (rc = sqlite
e6e0: 33 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65  3BitvecSet(pDone
e6f0: 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45  , pgno))!=SQLITE
e700: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
e710: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  n rc;.  }..  ass
e720: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
e730: 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
e740: 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  ED || pPager->st
e750: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
e760: 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  SIVE );..  /* If
e770: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
e780: 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c   RESERVED state,
e790: 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
e7a0: 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68   be a copy of th
e7b0: 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20  is.  ** page in 
e7c0: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
e7d0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75   In this case ju
e7e0: 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61  st update the pa
e7f0: 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20  ger cache,.  ** 
e800: 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65  not the database
e810: 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
e820: 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64  is left marked d
e830: 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73  irty in this cas
e840: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  e..  **.  ** An 
e850: 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65  exception to the
e860: 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20   above rule: If 
e870: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
e880: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a  in no-sync mode.
e890: 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20    ** and a page 
e8a0: 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20  is moved during 
e8b0: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
e8c0: 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70  acuum then the p
e8d0: 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74  age may.  ** not
e8e0: 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65 72   be in the pager
e8f0: 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69   cache. Later: i
e900: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20  f a malloc() or 
e910: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
e920: 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f    ** during a Mo
e930: 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74  vepage() call, t
e940: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79  hen the page may
e950: 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63   not be in the c
e960: 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72  ache.  ** either
e970: 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69  . So the conditi
e980: 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  on described in 
e990: 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67 72  the above paragr
e9a0: 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  aph is not.  ** 
e9b0: 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20  assert()able..  
e9c0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58  **.  ** If in EX
e9d0: 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74  CLUSIVE state, t
e9e0: 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68  hen we update th
e9f0: 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66  e pager cache if
ea00: 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20   it exists.  ** 
ea10: 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  and the main fil
ea20: 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74  e. The page is t
ea30: 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64  hen marked not d
ea40: 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  irty..  **.  ** 
ea50: 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54  Ticket #1171:  T
ea60: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
ea70: 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
ea80: 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  in page content 
ea90: 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66  that is.  ** dif
eaa0: 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
eab0: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20  page content at 
eac0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
ead0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
eae0: 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77  ** This occurs w
eaf0: 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68  hen a page is ch
eb00: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74  anged prior to t
eb10: 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74  he start of a st
eb20: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65  atement.  ** the
eb30: 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20  n changed again 
eb40: 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
eb50: 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c  ment.  When roll
eb60: 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a  ing back such a.
eb70: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77    ** statement w
eb80: 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65  e must not write
eb90: 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
eba0: 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73   database unless
ebb0: 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f   we know.  ** fo
ebc0: 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f  r certain that o
ebd0: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
ebe0: 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64  tents are synced
ebf0: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72   into the main r
ec00: 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
ec10: 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  rnal.  Otherwise
ec20: 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d  , a power loss m
ec30: 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66  ight leave modif
ec40: 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a  ied data in the.
ec50: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
ec60: 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e  le without an en
ec70: 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  try in the rollb
ec80: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ack journal that
ec90: 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72   can.  ** restor
eca0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
ecb0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66  o its original f
ecc0: 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74  orm.  Two condit
ecd0: 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a  ions must be.  *
ece0: 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69  * met before wri
ecf0: 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
ed00: 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20  base files. (1) 
ed10: 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
ed20: 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64  t be.  ** locked
ed30: 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74  .  (2) we know t
ed40: 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
ed50: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
ed60: 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20   fully synced.  
ed70: 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  ** in the main j
ed80: 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65  ournal either be
ed90: 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69  cause the page i
eda0: 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
edb0: 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20  r else.  ** the 
edc0: 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
edd0: 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20  s needSync==0.. 
ede0: 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34   **.  ** 2008-04
edf0: 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d  -14:  When attem
ee00: 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20  pting to vacuum 
ee10: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
ee20: 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a  se file, it.  **
ee30: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
ee40: 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74  fail a statement
ee50: 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74   on a database t
ee60: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74  hat does not yet
ee70: 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20   exist..  ** Do 
ee80: 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77  not attempt to w
ee90: 72 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65  rite if database
eea0: 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20   file has never 
eeb0: 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a  been opened..  *
eec0: 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  /.  pPg = pager_
eed0: 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
eee0: 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  gno);.  assert( 
eef0: 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b  pPg || !MEMDB );
ef00: 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
ef10: 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65  PLAYBACK %d page
ef20: 20 25 64 20 68 61 73 68 28 25 30 38 78 29 20 25   %d hash(%08x) %
ef30: 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
ef40: 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
ef50: 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
ef60: 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
ef70: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 61 44 61  r->pageSize, aDa
ef80: 74 61 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ta),.           
ef90: 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f      (isMainJrnl?
efa0: 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22  "main-journal":"
efb0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20  sub-journal").  
efc0: 29 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65  ));.  if( (pPage
efd0: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
efe0: 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 26 26  EXCLUSIVE).   &&
eff0: 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28   (pPg==0 || 0==(
f000: 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
f010: 5f 4e 45 45 44 5f 53 59 4e 43 29 29 0a 20 20 20  _NEED_SYNC)).   
f020: 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
f030: 2d 3e 66 64 29 0a 20 20 20 26 26 20 21 69 73 55  ->fd).   && !isU
f040: 6e 73 79 6e 63 0a 20 20 29 7b 0a 20 20 20 20 69  nsync.  ){.    i
f050: 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d  64 ofst = (pgno-
f060: 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
f070: 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63  pageSize;.    rc
f080: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
f090: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44  e(pPager->fd, aD
f0a0: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
f0b0: 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20  eSize, ofst);.  
f0c0: 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
f0d0: 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
f0e0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
f0f0: 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f  bFileSize = pgno
f100: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f110: 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
f120: 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28  ){.      CODEC1(
f130: 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70  pPager, aData, p
f140: 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
f150: 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20  E_NOMEM);.      
f160: 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
f170: 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
f180: 6b 75 70 2c 20 70 67 6e 6f 2c 20 61 44 61 74 61  kup, pgno, aData
f190: 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28  );.      CODEC1(
f1a0: 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70  pPager, aData, p
f1b0: 67 6e 6f 2c 20 30 2c 20 72 63 3d 53 51 4c 49 54  gno, 0, rc=SQLIT
f1c0: 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 7d 0a  E_NOMEM);.    }.
f1d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d    }else if( !isM
f1e0: 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d  ainJrnl && pPg==
f1f0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  0 ){.    /* If t
f200: 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63  his is a rollbac
f210: 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74  k of a savepoint
f220: 20 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f   and data was no
f230: 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20  t written to.   
f240: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
f250: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
f260: 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20   not in-memory, 
f270: 74 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e  there is a poten
f280: 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62  tial.    ** prob
f290: 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61  lem. When the pa
f2a0: 67 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68  ge is next fetch
f2b0: 65 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65  ed by the b-tree
f2c0: 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20   layer, it .    
f2d0: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20  ** will be read 
f2e0: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
f2f0: 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61  e file, which ma
f300: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
f310: 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e  .    ** current.
f320: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
f330: 54 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70  There are a coup
f340: 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20  le of different 
f350: 77 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61  ways this can ha
f360: 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75  ppen. All are qu
f370: 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75  ite.    ** obscu
f380: 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67  re. When running
f390: 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   in synchronous 
f3a0: 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f  mode, this can o
f3b0: 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20  nly happen .    
f3c0: 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ** if the page i
f3d0: 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  s on the free-li
f3e0: 73 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  st at the start 
f3f0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
f400: 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
f410: 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20  populated, then 
f420: 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69  moved using sqli
f430: 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
f440: 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
f450: 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69  * The solution i
f460: 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d  s to add an in-m
f470: 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68  emory page to th
f480: 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69  e cache containi
f490: 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  ng.    ** the da
f4a0: 74 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ta just read fro
f4b0: 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
f4c0: 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  l. Mark the page
f4d0: 20 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a   as dirty .    *
f4e0: 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67  * and if the pag
f4f0: 65 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f  er requires a jo
f500: 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e  urnal-sync, then
f510: 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
f520: 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  s .    ** requir
f530: 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79  ing a journal-sy
f540: 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20  nc before it is 
f550: 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a  written..    */.
f560: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61      assert( isSa
f570: 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 69 66 28  vepnt );.    if(
f580: 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61   (rc = sqlite3Pa
f590: 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67 65  gerAcquire(pPage
f5a0: 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31  r, pgno, &pPg, 1
f5b0: 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))!=SQLITE_OK ){
f5c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
f5d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
f5e0: 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52  >flags &= ~PGHDR
f5f0: 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20  _NEED_READ;.    
f600: 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
f610: 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d  eDirty(pPg);.  }
f620: 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
f630: 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f    /* No page sho
f640: 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c  uld ever be expl
f650: 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61  icitly rolled ba
f660: 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73  ck that is in us
f670: 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  e, except.    **
f680: 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63   for page 1 whic
f690: 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65  h is held in use
f6a0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
f6b0: 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  p the lock on th
f6c0: 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
f6d0: 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65  e active. Howeve
f6e0: 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61  r such a page ma
f6f0: 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y be rolled back
f700: 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20   as a result.   
f710: 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e   ** of an intern
f720: 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69  al error resulti
f730: 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74  ng in an automat
f740: 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ic call to.    *
f750: 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  * sqlite3PagerRo
f760: 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f  llback()..    */
f770: 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61  .    void *pData
f780: 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70 50  ;.    pData = pP
f790: 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65  g->pData;.    me
f7a0: 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44 61 74  mcpy(pData, aDat
f7b0: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
f7c0: 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ize);.    pPager
f7d0: 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29  ->xReiniter(pPg)
f7e0: 3b 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e  ;.    if( isMain
f7f0: 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65  Jrnl && (!isSave
f800: 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c  pnt || *pOffset<
f810: 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
f820: 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Hdr) ){.      /*
f830: 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   If the contents
f840: 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65   of this page we
f850: 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64  re just restored
f860: 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a   from the main .
f870: 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
f880: 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20   file, then its 
f890: 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20  content must be 
f8a0: 61 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65  as they were whe
f8b0: 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
f8c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
f8d0: 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e  first opened. In
f8e0: 20 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61   this case we ca
f8f0: 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a  n mark the page.
f900: 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61        ** as clea
f910: 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77  n, since there w
f920: 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74  ill be no need t
f930: 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74  o write it out t
f940: 6f 20 74 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  o the..      **.
f950: 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69        ** There i
f960: 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20  s one exception 
f970: 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66  to this rule. If
f980: 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69   the page is bei
f990: 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20  ng rolled.      
f9a0: 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74 20  ** back as part 
f9b0: 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28  of a savepoint (
f9c0: 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f  or statement) ro
f9d0: 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a  llback from an .
f9e0: 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65        ** unsynce
f9f0: 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  d portion of the
fa00: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
fa10: 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e  le, then it is n
fa20: 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a  ot safe.      **
fa30: 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67   to mark the pag
fa40: 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73  e as clean. This
fa50: 20 69 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b   is because mark
fa60: 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 73 0a  ing the page as.
fa70: 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77        ** clean w
fa80: 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47  ill clear the PG
fa90: 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
faa0: 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61  ag. Since the pa
fab0: 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  ge is.      ** a
fac0: 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f  lready in the jo
fad0: 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f  urnal file (reco
fae0: 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49  rded in Pager.pI
faf0: 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20  nJournal) and.  
fb00: 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52      ** the PGHDR
fb10: 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
fb20: 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74  is cleared, if t
fb30: 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
fb40: 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61  en to.      ** a
fb50: 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73  gain within this
fb60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74   transaction, it
fb70: 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20   will be marked 
fb80: 61 73 20 64 69 72 74 79 20 62 75 74 0a 20 20 20  as dirty but.   
fb90: 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f     ** the PGHDR_
fba0: 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77  NEED_SYNC flag w
fbb0: 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20  ill not be set. 
fbc0: 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f  It could then po
fbd0: 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20  tentially.      
fbe0: 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75  ** be written ou
fbf0: 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  t into the datab
fc00: 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20  ase file before 
fc10: 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  its journal file
fc20: 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e  .      ** segmen
fc30: 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20  t is synced. If 
fc40: 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 64  a crash occurs d
fc50: 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69  uring or followi
fc60: 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a  ng this,.      *
fc70: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  * database corru
fc80: 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e  ption may ensue.
fc90: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
fca0: 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
fcb0: 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
fcc0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
fcd0: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
fce0: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
fcf0: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
fd00: 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
fd10: 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
fd20: 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73  page 1, then res
fd30: 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f  tore the value o
fd40: 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  f Pager.dbFileVe
fd50: 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68  rs..    ** Do th
fd60: 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65  is before any de
fd70: 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69  coding. */.    i
fd80: 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
fd90: 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
fda0: 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
fdb0: 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34  &((u8*)pData)[24
fdc0: 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  ],sizeof(pPager-
fdd0: 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
fde0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63     }..    /* Dec
fdf0: 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73  ode the page jus
fe00: 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b  t read from disk
fe10: 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70   */.    CODEC1(p
fe20: 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
fe30: 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53  g->pgno, 3, rc=S
fe40: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20  QLITE_NOMEM);.  
fe50: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
fe60: 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d  elease(pPg);.  }
fe70: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
fe80: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
fe90: 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
fea0: 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45  (SQLITE_COVERAGE
feb0: 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68 69  _TEST)./*.** Thi
fec0: 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
fed0: 61 68 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6d  ahead into the m
fee0: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
fef0: 20 61 6e 64 20 64 65 74 65 72 6d 69 6e 65 73 0a   and determines.
ff00: 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
ff10: 74 20 74 68 65 20 6e 65 78 74 20 72 65 63 6f 72  t the next recor
ff20: 64 20 28 74 68 65 20 72 65 63 6f 72 64 20 74 68  d (the record th
ff30: 61 74 20 62 65 67 69 6e 73 20 61 74 20 66 69 6c  at begins at fil
ff40: 65 0a 2a 2a 20 6f 66 66 73 65 74 20 70 50 61 67  e.** offset pPag
ff50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
ff60: 69 73 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  is a well-formed
ff70: 20 70 61 67 65 20 72 65 63 6f 72 64 20 63 6f 6e   page record con
ff80: 73 69 73 74 69 6e 67 0a 2a 2a 20 6f 66 20 61 20  sisting.** of a 
ff90: 76 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65  valid page numbe
ffa0: 72 2c 20 70 50 61 67 65 2d 3e 70 61 67 65 53 69  r, pPage->pageSi
ffb0: 7a 65 20 62 79 74 65 73 20 6f 66 20 63 6f 6e 74  ze bytes of cont
ffc0: 65 6e 74 2c 20 66 6f 6c 6c 6f 77 65 64 0a 2a 2a  ent, followed.**
ffd0: 20 62 79 20 61 20 76 61 6c 69 64 20 63 68 65 63   by a valid chec
ffe0: 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ksum..**.** The 
fff0: 70 61 67 65 72 20 6e 65 76 65 72 20 6e 65 65 64  pager never need
10000 73 20 74 6f 20 6b 6e 6f 77 20 74 68 69 73 20 69  s to know this i
10010 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f 20 69 74  n order to do it
10020 73 20 6a 6f 62 2e 20 20 20 54 68 69 73 0a 2a 2a  s job.   This.**
10030 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
10040 20 75 73 65 64 20 66 72 6f 6d 20 77 69 74 68 69   used from withi
10050 6e 20 61 73 73 65 72 74 28 29 20 61 6e 64 20 74  n assert() and t
10060 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 73  estcase() macros
10070 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10080 70 61 67 65 72 4e 65 78 74 4a 6f 75 72 6e 61 6c  pagerNextJournal
10090 50 61 67 65 49 73 56 61 6c 69 64 28 50 61 67 65  PageIsValid(Page
100a0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
100b0 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
100c0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
100d0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
100e0 65 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  e */.  u32 cksum
100f0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
10100 68 65 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d  he page checksum
10110 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
10120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10130 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 72  turn code from r
10140 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a  ead operations *
10150 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
10160 20 2a 66 64 3b 20 20 20 20 2f 2a 20 54 68 65 20   *fd;    /* The 
10170 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
10180 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20 61 72  from which we ar
10190 65 20 72 65 61 64 69 6e 67 20 2a 2f 0a 20 20 75  e reading */.  u
101a0 38 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20  8 *aData;       
101b0 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
101c0 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 0a 20  f the page */.. 
101d0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67   /* Read the pag
101e0 65 20 6e 75 6d 62 65 72 20 68 65 61 64 65 72 20  e number header 
101f0 2a 2f 0a 20 20 66 64 20 3d 20 70 50 61 67 65 72  */.  fd = pPager
10200 2d 3e 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65  ->jfd;.  rc = re
10210 61 64 33 32 62 69 74 73 28 66 64 2c 20 70 50 61  ad32bits(fd, pPa
10220 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
10230 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72   &pgno);.  if( r
10240 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20  c!=SQLITE_OK ){ 
10250 72 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20 20  return 0; }     
10260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e               /*N
10280 4f 5f 54 45 53 54 2a 2f 0a 20 20 69 66 28 20 70  O_TEST*/.  if( p
10290 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
102a0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
102b0 61 67 65 72 29 20 29 7b 20 72 65 74 75 72 6e 20  ager) ){ return 
102c0 30 3b 20 7d 20 20 20 20 20 20 20 20 20 2f 2a 4e  0; }         /*N
102d0 4f 5f 54 45 53 54 2a 2f 0a 20 20 69 66 28 20 70  O_TEST*/.  if( p
102e0 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72  gno>(Pgno)pPager
102f0 2d 3e 64 62 53 69 7a 65 20 29 7b 20 72 65 74 75  ->dbSize ){ retu
10300 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20  rn 0; }         
10310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e               /*N
10320 4f 5f 54 45 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52  O_TEST*/..  /* R
10330 65 61 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ead the checksum
10340 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33   */.  rc = read3
10350 32 62 69 74 73 28 66 64 2c 20 70 50 61 67 65 72  2bits(fd, pPager
10360 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 70 50 61  ->journalOff+pPa
10370 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c  ger->pageSize+4,
10380 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20   &cksum);.  if( 
10390 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
103a0 20 72 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20   return 0; }    
103b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
103d0 4e 4f 5f 54 45 53 54 2a 2f 0a 0a 20 20 2f 2a 20  NO_TEST*/..  /* 
103e0 52 65 61 64 20 74 68 65 20 64 61 74 61 20 61 6e  Read the data an
103f0 64 20 76 65 72 69 66 79 20 74 68 65 20 63 68 65  d verify the che
10400 63 6b 73 75 6d 20 2a 2f 0a 20 20 61 44 61 74 61  cksum */.  aData
10410 20 3d 20 28 75 38 2a 29 70 50 61 67 65 72 2d 3e   = (u8*)pPager->
10420 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20  pTmpSpace;.  rc 
10430 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
10440 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  fd, aData, pPage
10450 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 61  r->pageSize, pPa
10460 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
10470 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
10480 4c 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74 75 72  LITE_OK ){ retur
10490 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20  n 0; }          
104a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104b0 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53          /*NO_TES
104c0 54 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72 5f  T*/.  if( pager_
104d0 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 61 44  cksum(pPager, aD
104e0 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 20 72  ata)!=cksum ){ r
104f0 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20 20 20  eturn 0; }      
10500 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53          /*NO_TES
10510 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 63 68 20  T*/..  /* Reach 
10520 74 68 69 73 20 70 6f 69 6e 74 20 6f 6e 6c 79 20  this point only 
10530 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 76  if the page is v
10540 61 6c 69 64 20 2a 2f 0a 20 20 72 65 74 75 72 6e  alid */.  return
10550 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
10560 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
10570 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
10580 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54  TE_COVERAGE_TEST
10590 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  ) */../*.** Para
105a0 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73  meter zMaster is
105b0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
105c0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
105d0 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75  le. A single jou
105e0 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61  rnal.** file tha
105f0 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68  t referred to th
10600 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10610 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62   file has just b
10620 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  een rolled back.
10630 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
10640 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73   checks if it is
10650 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
10660 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
10670 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20  ournal file,.** 
10680 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69  and does so if i
10690 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  t is..**.** Argu
106a0 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79  ment zMaster may
106b0 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e   point to Pager.
106c0 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68  pTmpSpace. So th
106d0 61 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74  at buffer is not
106e0 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66   .** available f
106f0 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20 74 68  or use within th
10700 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
10710 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72  ** When a master
10720 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
10730 20 63 72 65 61 74 65 64 2c 20 69 74 20 69 73 20   created, it is 
10740 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
10750 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20  he names .** of 
10760 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64  all of its child
10770 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61   journals, one a
10780 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f  fter another, fo
10790 72 6d 61 74 74 65 64 20 61 73 20 75 74 66 2d 38  rmatted as utf-8
107a0 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78   .** encoded tex
107b0 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61  t. The end of ea
107c0 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ch child journal
107d0 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20   file is marked 
107e0 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74  with a .** nul-t
107f0 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28  erminator byte (
10800 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20  0x00). i.e. the 
10810 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20  entire contents 
10820 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
10830 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20  nal.** file for 
10840 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
10850 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61  volving two data
10860 62 61 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a  bases might be:.
10870 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62  **.**   "/home/b
10880 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c  ill/a.db-journal
10890 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62  \x00/home/bill/b
108a0 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22  .db-journal\x00"
108b0 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20  .**.** A master 
108c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79  journal file may
108d0 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64   only be deleted
108e0 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73   once all of its
108f0 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e   child .** journ
10900 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f  als have been ro
10910 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
10920 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
10930 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  eads the content
10940 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d  s of the master-
10950 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
10960 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64  o .** memory and
10970 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65   loops through e
10980 61 63 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ach of the child
10990 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20   journal names. 
109a0 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c  For.** each chil
109b0 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68  d journal, it ch
109c0 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  ecks if:.**.**  
109d0 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20   * if the child 
109e0 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20  journal exists, 
109f0 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a  and if so.**   *
10a00 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f   if the child jo
10a10 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61  urnal contains a
10a20 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61   reference to ma
10a30 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a  ster journal .**
10a40 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65       file zMaste
10a50 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69  r.**.** If a chi
10a60 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  ld journal can b
10a70 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74  e found that mat
10a80 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65  ches both of the
10a90 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f   criteria.** abo
10aa0 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ve, this functio
10ab0 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75  n returns withou
10ac0 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
10ad0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a  . Otherwise, if.
10ae0 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64  ** no such child
10af0 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
10b00 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73  found, file zMas
10b10 74 65 72 20 69 73 20 64 65 6c 65 74 65 64 20 66  ter is deleted f
10b20 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d  rom.** the file-
10b30 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c  system using sql
10b40 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a  ite3OsDelete()..
10b50 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65  **.** If an IO e
10b60 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73  rror within this
10b70 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72   function, an er
10b80 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
10b90 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75  rned. This.** fu
10ba0 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73  nction allocates
10bb0 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69   memory by calli
10bc0 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  ng sqlite3Malloc
10bd0 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61  (). If an alloca
10be0 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53  tion.** fails, S
10bf0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
10c00 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
10c10 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20  se, if no IO or 
10c20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a  malloc errors .*
10c30 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f  * occur, SQLITE_
10c40 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
10c50 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73  **.** TODO: This
10c60 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
10c70 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f  tes a single blo
10c80 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20  ck of memory to 
10c90 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69  load.** the enti
10ca0 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
10cb0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10cc0 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75  l file. This cou
10cd0 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c  ld be.** a coupl
10ce0 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f  e of kilobytes o
10cf0 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c  r so - potential
10d00 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  ly larger than t
10d10 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65  he page .** size
10d20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10d30 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28  pager_delmaster(
10d40 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
10d50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
10d60 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  er){.  sqlite3_v
10d70 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
10d80 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  r->pVfs;.  int r
10d90 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
10da0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
10db0 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
10dc0 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20  _file *pMaster; 
10dd0 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d     /* Malloc'd m
10de0 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
10df0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
10e00 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
10e10 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20  *pJournal;   /* 
10e20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a  Malloc'd child-j
10e30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
10e40 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72  riptor */.  char
10e50 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   *zMasterJournal
10e60 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74   = 0; /* Content
10e70 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
10e80 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
10e90 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  4 nMasterJournal
10ea0 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  ;       /* Size 
10eb0 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
10ec0 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20  l file */..  /* 
10ed0 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
10ee0 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75  or both the pJou
10ef0 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72  rnal and pMaster
10f00 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
10f10 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65  s..  ** If succe
10f20 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20  ssful, open the 
10f30 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
10f40 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  ile for reading.
10f50 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20  .  */.  pMaster 
10f60 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
10f70 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
10f80 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ero(pVfs->szOsFi
10f90 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72  le * 2);.  pJour
10fa0 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  nal = (sqlite3_f
10fb0 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d  ile *)(((u8 *)pM
10fc0 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73  aster) + pVfs->s
10fd0 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  zOsFile);.  if( 
10fe0 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  !pMaster ){.    
10ff0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
11000 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
11010 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
11020 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
11030 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
11040 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
11050 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  AL);.    rc = sq
11060 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
11070 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74  , zMaster, pMast
11080 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  er, flags, 0);. 
11090 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
110a0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
110b0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
110c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
110d0 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20  leSize(pMaster, 
110e0 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  &nMasterJournal)
110f0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
11100 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
11110 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69  master_out;..  i
11120 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( nMasterJourna
11130 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  l>0 ){.    char 
11140 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63  *zJournal;.    c
11150 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20  har *zMasterPtr 
11160 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61  = 0;.    int nMa
11170 73 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e  sterPtr = pVfs->
11180 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20  mxPathname+1;.. 
11190 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65     /* Load the e
111a0 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
111b0 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73  rnal file into s
111c0 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72  pace obtained fr
111d0 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  om.    ** sqlite
111e0 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  3_malloc() and p
111f0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
11200 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20  sterJournal. .  
11210 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72    */.    zMaster
11220 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20  Journal = (char 
11230 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  *)sqlite3Malloc(
11240 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72  (int)nMasterJour
11250 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72  nal + nMasterPtr
11260 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73  );.    if( !zMas
11270 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
11280 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11290 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
112a0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
112b0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 61 73 74  .    }.    zMast
112c0 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72  erPtr = &zMaster
112d0 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
112e0 6f 75 72 6e 61 6c 5d 3b 0a 20 20 20 20 72 63 20  ournal];.    rc 
112f0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
11300 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72  pMaster, zMaster
11310 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d  Journal, (int)nM
11320 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29  asterJournal, 0)
11330 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
11340 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
11350 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
11360 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d     zJournal = zM
11370 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20  asterJournal;.  
11380 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e    while( (zJourn
11390 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al-zMasterJourna
113a0 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l)<nMasterJourna
113b0 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  l ){.      int e
113c0 78 69 73 74 73 3b 0a 20 20 20 20 20 20 72 63 20  xists;.      rc 
113d0 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
113e0 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  s(pVfs, zJournal
113f0 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
11400 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29  EXISTS, &exists)
11410 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
11420 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11430 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
11440 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
11450 0a 20 20 20 20 20 20 69 66 28 20 65 78 69 73 74  .      if( exist
11460 73 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  s ){.        /* 
11470 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  One of the journ
11480 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  als pointed to b
11490 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  y the master jou
114a0 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20  rnal exists..   
114b0 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20       ** Open it 
114c0 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20  and check if it 
114d0 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61  points at the ma
114e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
114f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20  .        ** so, 
11500 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
11510 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74  eleting the mast
11520 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
11530 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
11540 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20      int c;.     
11550 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
11560 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
11570 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
11580 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _MAIN_JOURNAL);.
11590 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
115a0 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
115b0 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72   zJournal, pJour
115c0 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  nal, flags, 0);.
115d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
115e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
115f0 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
11600 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
11610 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63     }..        rc
11620 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
11630 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a  rnal(pJournal, z
11640 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74  MasterPtr, nMast
11650 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20  erPtr);.        
11660 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
11670 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
11680 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11690 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
116a0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
116b0 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  out;.        }..
116c0 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73          c = zMas
116d0 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20  terPtr[0]!=0 && 
116e0 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
116f0 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
11700 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b          if( c ){
11710 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
11720 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44   have a match. D
11730 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
11740 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11750 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
11760 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
11770 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
11780 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
11790 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69  Journal += (sqli
117a0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75  te3Strlen30(zJou
117b0 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a  rnal)+1);.    }.
117c0 20 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71    }.  .  rc = sq
117d0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
117e0 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
117f0 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a  ..delmaster_out:
11800 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f  .  if( zMasterJo
11810 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c  urnal ){.    sql
11820 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65  ite3_free(zMaste
11830 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20  rJournal);.  }  
11840 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72 20 29  .  if( pMaster )
11850 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
11860 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
11870 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
11880 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a  en(pJournal) );.
11890 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
118a0 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ee(pMaster);.  r
118b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
118c0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
118d0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 61  n is used to cha
118e0 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c 20 73  nge the actual s
118f0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
11900 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20  ase .** file in 
11910 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
11920 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65   This only happe
11930 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69  ns when committi
11940 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
11950 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20  ,.** or rolling 
11960 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69  back a transacti
11970 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f  on (including ro
11980 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74  lling back a hot
11990 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a  -journal)..**.**
119a0 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74   If the main dat
119b0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f  abase file is no
119c0 74 20 6f 70 65 6e 2c 20 6f 72 20 61 6e 20 65 78  t open, or an ex
119d0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
119e0 6e 6f 74 0a 2a 2a 20 68 65 6c 64 2c 20 74 68 69  not.** held, thi
119f0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
11a00 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
11a10 2c 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  , the size of th
11a20 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 68 61  e file is.** cha
11a30 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61  nged to nPage pa
11a40 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65  ges (nPage*pPage
11a50 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
11a60 73 29 2e 20 49 66 20 74 68 65 20 66 69 6c 65 0a  s). If the file.
11a70 2a 2a 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75  ** on disk is cu
11a80 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74  rrently larger t
11a90 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c  han nPage pages,
11aa0 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 56 46   then use the VF
11ab0 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29  S.** xTruncate()
11ac0 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63   method to trunc
11ad0 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72  ate it..**.** Or
11ae0 2c 20 69 74 20 6d 69 67 68 74 20 6d 69 67 68 74  , it might might
11af0 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
11b00 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  t the file on di
11b10 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  sk is smaller th
11b20 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67  an .** nPage pag
11b30 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69  es. Some operati
11b40 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d  ng system implem
11b50 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65  entations can ge
11b60 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a  t confused if .*
11b70 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75  * you try to tru
11b80 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20  ncate a file to 
11b90 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69  some size that i
11ba0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74  s larger than it
11bb0 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69   .** currently i
11bc0 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68 69  s, so detect thi
11bd0 73 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65  s case and write
11be0 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62   a single zero b
11bf0 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65  yte to .** the e
11c00 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69  nd of the new fi
11c10 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  le instead..**.*
11c20 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
11c30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11c40 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  K. If an IO erro
11c50 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d  r occurs while m
11c60 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20  odifying.** the 
11c70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72  database file, r
11c80 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
11c90 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
11ca0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
11cb0 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  t pager_truncate
11cc0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
11cd0 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69  Pgno nPage){.  i
11ce0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
11cf0 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
11d00 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
11d10 43 4c 55 53 49 56 45 20 26 26 20 69 73 4f 70 65  CLUSIVE && isOpe
11d20 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
11d30 0a 20 20 20 20 69 36 34 20 63 75 72 72 65 6e 74  .    i64 current
11d40 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20  Size, newSize;. 
11d50 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69     /* TODO: Is i
11d60 74 20 73 61 66 65 20 74 6f 20 75 73 65 20 50 61  t safe to use Pa
11d70 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68  ger.dbFileSize h
11d80 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ere? */.    rc =
11d90 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
11da0 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
11db0 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20  currentSize);.  
11dc0 20 20 6e 65 77 53 69 7a 65 20 3d 20 70 50 61 67    newSize = pPag
11dd0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36  er->pageSize*(i6
11de0 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28  4)nPage;.    if(
11df0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
11e00 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e  & currentSize!=n
11e10 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
11e20 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e  if( currentSize>
11e30 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
11e40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
11e50 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
11e60 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a  ->fd, newSize);.
11e70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11e80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11e90 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
11ea0 3e 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65 77 53  >fd, "", 1, newS
11eb0 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  ize-1);.      }.
11ec0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
11ed0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11ee0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
11ef0 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  eSize = nPage;. 
11f00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
11f10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11f20 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76  ./*.** Set the v
11f30 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67 65  alue of the Page
11f40 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
11f50 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69  iable for the gi
11f60 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73  ven.** pager bas
11f70 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ed on the value 
11f80 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
11f90 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68  xSectorSize meth
11fa0 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65  od.** of the ope
11fb0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
11fc0 20 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   The sector size
11fd0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 75 73   will be used us
11fe0 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d  ed .** to determ
11ff0 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64  ine the size and
12000 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f   alignment of jo
12010 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64  urnal header and
12020 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72   .** master jour
12030 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74  nal pointers wit
12040 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72  hin created jour
12050 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  nal files..**.**
12060 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   For temporary f
12070 69 6c 65 73 20 74 68 65 20 65 66 66 65 63 74 69  iles the effecti
12080 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  ve sector size i
12090 73 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74  s always 512 byt
120a0 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  es..**.** Otherw
120b0 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d  ise, for non-tem
120c0 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68  porary files, th
120d0 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
120e0 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68  or size is.** th
120f0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
12100 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53   by the xSectorS
12110 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75  ize() method rou
12120 6e 64 65 64 20 75 70 20 74 6f 20 35 31 32 20 69  nded up to 512 i
12130 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20  f.** it is less 
12140 74 68 61 6e 20 35 31 32 2c 20 6f 72 20 72 6f 75  than 512, or rou
12150 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58  nded down to MAX
12160 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20  _SECTOR_SIZE if 
12170 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  it.** is greater
12180 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52   than MAX_SECTOR
12190 5f 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  _SIZE..*/.static
121a0 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53   void setSectorS
121b0 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
121c0 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73  r){.  assert( is
121d0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
121e0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
121f0 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 21  File );..  if( !
12200 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
12210 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f   ){.    /* Secto
12220 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d  r size doesn't m
12230 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72  atter for tempor
12240 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c  ary files. Also,
12250 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
12260 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65   may not have be
12270 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69  en opened yet, i
12280 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
12290 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a   OsSectorSize().
122a0 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c      ** call will
122b0 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a   segfault..    *
122c0 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
122d0 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
122e0 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
122f0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a  Pager->fd);.  }.
12300 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
12310 63 74 6f 72 53 69 7a 65 3c 35 31 32 20 29 7b 0a  ctorSize<512 ){.
12320 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
12330 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20  orSize = 512;.  
12340 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
12350 73 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53  sectorSize>MAX_S
12360 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20  ECTOR_SIZE ){.  
12370 20 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45    assert( MAX_SE
12380 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29  CTOR_SIZE>=512 )
12390 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  ;.    pPager->se
123a0 63 74 6f 72 53 69 7a 65 20 3d 20 4d 41 58 5f 53  ctorSize = MAX_S
123b0 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a  ECTOR_SIZE;.  }.
123c0 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
123d0 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  k the journal an
123e0 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74  d thus restore t
123f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
12400 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65   to.** the state
12410 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72   it was in befor
12420 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b  e we started mak
12430 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a  ing changes.  .*
12440 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
12450 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20   file format is 
12460 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a  as follows: .**.
12470 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20  **  (1)  8 byte 
12480 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20  prefix.  A copy 
12490 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of aJournalMagic
124a0 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62  []..**  (2)  4 b
124b0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
124c0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
124d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61  the number of va
124e0 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73  lid page records
124f0 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65  .**       in the
12500 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68   journal.  If th
12510 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  is value is 0xff
12520 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d  ffffff, then com
12530 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  pute the.**     
12540 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65    number of page
12550 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68   records from th
12560 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a  e journal size..
12570 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20  **  (3)  4 byte 
12580 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
12590 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
125a0 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f  initial value fo
125b0 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20  r the .**       
125c0 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e  sanity checksum.
125d0 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65  .**  (4)  4 byte
125e0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
125f0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
12600 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74  pages to truncat
12610 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64  e the.**       d
12620 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e  atabase to durin
12630 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  g a rollback..**
12640 20 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69    (5)  4 byte bi
12650 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
12660 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65   which is the se
12670 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20  ctor size.  The 
12680 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20  header.**       
12690 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  is this many byt
126a0 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20  es in size..**  
126b0 28 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (6)  4 byte big-
126c0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
126d0 68 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65  hich is the page
126e0 20 63 61 73 65 2e 0a 2a 2a 20 20 28 37 29 20 20   case..**  (7)  
126f0 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
12700 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
12710 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
12720 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
12730 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e  l.**       name.
12740 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79 20    The value may 
12750 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61 74  be zero (indicat
12760 65 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  e that there is 
12770 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20  no master.**    
12780 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20     journal.).** 
12790 20 28 38 29 20 20 4e 20 62 79 74 65 73 20 6f 66   (8)  N bytes of
127a0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
127b0 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e  nal name.  The n
127c0 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d  ame will be nul-
127d0 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20  terminated.**   
127e0 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62 65      and might be
127f0 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74 68   shorter than th
12800 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
12810 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65 20 66  m (5).  If the f
12820 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20 20  irst byte.**    
12830 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69     of the name i
12840 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65 72  s \000 then ther
12850 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a  e is no master j
12860 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73  ournal.  The mas
12870 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75  ter.**       jou
12880 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f  rnal name is sto
12890 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a  red in UTF-8..**
128a0 20 20 28 39 29 20 20 5a 65 72 6f 20 6f 72 20 6d    (9)  Zero or m
128b0 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e  ore pages instan
128c0 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c  ces, each as fol
128d0 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20  lows:.**        
128e0 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e  +  4 byte page n
128f0 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20  umber..**       
12900 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65   +  pPager->page
12910 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
12920 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ta..**        + 
12930 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d   4 byte checksum
12940 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73  .**.** When we s
12950 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72  peak of the jour
12960 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d  nal header, we m
12970 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 38 20  ean the first 8 
12980 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20  items above..** 
12990 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68  Each entry in th
129a0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20  e journal is an 
129b0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
129c0 39 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  9th item..**.** 
129d0 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66  Call the value f
129e0 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62  rom the second b
129f0 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e  ullet "nRec".  n
12a00 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Rec is the numbe
12a10 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61  r of.** valid pa
12a20 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ge entries in th
12a30 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d  e journal.  In m
12a40 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63  ost cases, you c
12a50 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  an compute the.*
12a60 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  * value of nRec 
12a70 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66  from the size of
12a80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12a90 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77  e.  But if a pow
12aa0 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63  er.** failure oc
12ab0 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65  curred while the
12ac0 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69   journal was bei
12ad0 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63  ng written, it c
12ae0 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63  ould be the.** c
12af0 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a  ase that the siz
12b00 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
12b10 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64   file had alread
12b20 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64  y been increased
12b30 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72   but.** the extr
12b40 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f  a entries had no
12b50 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61  t yet made it sa
12b60 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49  fely to disk.  I
12b70 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a  n such a case,.*
12b80 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
12b90 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f  Rec computed fro
12ba0 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  m the file size 
12bb0 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72  would be too lar
12bc0 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74  ge.  For.** that
12bd0 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61   reason, we alwa
12be0 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20  ys use the nRec 
12bf0 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61  value in the hea
12c00 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  der..**.** If th
12c10 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20  e nRec value is 
12c20 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65  0xffffffff it me
12c30 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68  ans that nRec sh
12c40 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
12c50 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  .** from the fil
12c60 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61  e size.  This va
12c70 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e  lue is used when
12c80 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74   the user select
12c90 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63  s the.** no-sync
12ca0 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20   option for the 
12cb0 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65  journal.  A powe
12cc0 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
12cd0 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69  lead to corrupti
12ce0 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  on.** in this ca
12cf0 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69  se.  But for thi
12d00 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61  ngs like tempora
12d10 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20  ry table (which 
12d20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74  will be.** delet
12d30 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65  ed when the powe
12d40 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77  r is restored) w
12d50 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a  e don't care.  .
12d60 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
12d70 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20  e opened as the 
12d80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
12d90 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  not a well-forme
12da0 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  d.** journal fil
12db0 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  e then all pages
12dc0 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74   up to the first
12dd0 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20   corrupted page 
12de0 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61  are rolled.** ba
12df0 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20  ck (or no pages 
12e00 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  if the journal h
12e10 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74  eader is corrupt
12e20 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ed). The journal
12e30 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e   file.** is then
12e40 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c   deleted and SQL
12e50 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c  ITE_OK returned,
12e60 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63   just as if no c
12e70 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a  orruption had.**
12e80 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65   been encountere
12e90 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  d..**.** If an I
12ea0 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  /O or malloc() e
12eb0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
12ec0 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73   journal-file is
12ed0 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20   not deleted.** 
12ee0 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
12ef0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
12f00 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70  *.** The isHot p
12f10 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74  arameter indicat
12f20 65 73 20 74 68 61 74 20 77 65 20 61 72 65 20 74  es that we are t
12f30 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  rying to rollbac
12f40 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74  k a journal.** t
12f50 68 61 74 20 6d 69 67 68 74 20 62 65 20 61 20 68  hat might be a h
12f60 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c  ot journal.  Or,
12f70 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61   it could be tha
12f80 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
12f90 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62   .** preserved b
12fa0 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41  ecause of JOURNA
12fb0 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72  LMODE_PERSIST or
12fc0 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55   JOURNALMODE_TRU
12fd0 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65  NCATE..** If the
12fe0 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20   journal really 
12ff0 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68  is hot, reset th
13000 65 20 70 61 67 65 72 20 63 61 63 68 65 20 70 72  e pager cache pr
13010 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62  ior rolling.** b
13020 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e  ack any content.
13030 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    If the journal
13040 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69   is merely persi
13050 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20  stent, no reset 
13060 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f  is.** needed..*/
13070 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
13080 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  r_playback(Pager
13090 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73   *pPager, int is
130a0 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Hot){.  sqlite3_
130b0 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
130c0 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20  er->pVfs;.  i64 
130d0 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
130e0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
130f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13100 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
13110 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  32 nRec;        
13120 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
13130 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20  r of Records in 
13140 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
13150 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20   u32 u;         
13160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
13170 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74  igned loop count
13180 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  er */.  Pgno mxP
13190 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
131a0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
131b0 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e  original file in
131c0 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
131d0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
131e0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
131f0 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74  ode of a subrout
13200 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  ine */.  int res
13210 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
13220 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
13230 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
13240 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68  Access() */.  ch
13250 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
13260 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
13270 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
13280 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a   file if any */.
13290 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52    int needPagerR
132a0 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72  eset;      /* Tr
132b0 75 65 20 74 6f 20 72 65 73 65 74 20 70 61 67 65  ue to reset page
132c0 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20   prior to first 
132d0 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  page rollback */
132e0 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
132f0 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
13300 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f  ds are in the jo
13310 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61  urnal.  Abort ea
13320 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  rly if.  ** the 
13330 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79  journal is empty
13340 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
13350 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
13360 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  jfd) );.  rc = s
13370 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
13380 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73  (pPager->jfd, &s
13390 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
133a0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d  QLITE_OK || szJ=
133b0 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  =0 ){.    goto e
133c0 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
133d0 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
133e0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
133f0 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ame from the jou
13400 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70  rnal, if it is p
13410 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20  resent..  ** If 
13420 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
13430 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70   file name is sp
13440 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65  ecified, but the
13450 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a   file is not.  *
13460 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73  * present on dis
13470 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  k, then the jour
13480 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61  nal is not hot a
13490 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  nd does not need
134a0 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79   to be.  ** play
134b0 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20  ed back..  **.  
134c0 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63  ** TODO: Technic
134d0 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ally the followi
134e0 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20 62  ng is an error b
134f0 65 63 61 75 73 65 20 69 74 20 61 73 73 75 6d 65  ecause it assume
13500 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66 66  s that.  ** buff
13510 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  er Pager.pTmpSpa
13520 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61 6d  ce is (mxPathnam
13530 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c 61  e+1) bytes or la
13540 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a  rger. i.e. that.
13550 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70 61    ** (pPager->pa
13560 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72  geSize >= pPager
13570 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
13580 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f  me+1). Using os_
13590 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78  unix.c,.  **  mx
135a0 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32 2c  Pathname is 512,
135b0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73 61   which is the sa
135c0 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d 75  me as the minimu
135d0 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75  m allowable valu
135e0 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 53  e.  ** for pageS
135f0 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73  ize..  */.  zMas
13600 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ter = pPager->pT
13610 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20  mpSpace;.  rc = 
13620 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
13630 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  l(pPager->jfd, z
13640 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e  Master, pPager->
13650 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
13660 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  +1);.  if( rc==S
13670 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
13680 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63  ter[0] ){.    rc
13690 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
136a0 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  ss(pVfs, zMaster
136b0 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
136c0 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20  EXISTS, &res);. 
136d0 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30   }.  zMaster = 0
136e0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
136f0 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b  TE_OK || !res ){
13700 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
13710 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50  ayback;.  }.  pP
13720 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
13730 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67 65   = 0;.  needPage
13740 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a  rReset = isHot;.
13750 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  /* This loop 
13760 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65  terminates eithe
13770 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f 75  r when a readJou
13780 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20 20  rnalHdr() or .  
13790 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  ** pager_playbac
137a0 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61 6c  k_one_page() cal
137b0 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  l returns SQLITE
137c0 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65  _DONE or an IO e
137d0 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72  rror .  ** occur
137e0 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  s. .  */.  while
137f0 28 20 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ( 1 ){.    int i
13800 73 55 6e 73 79 6e 63 20 3d 20 30 3b 0a 0a 20 20  sUnsync = 0;..  
13810 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65    /* Read the ne
13820 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  xt journal heade
13830 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  r from the journ
13840 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  al file.  If the
13850 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f  re are.    ** no
13860 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c  t enough bytes l
13870 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  eft in the journ
13880 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f  al file for a co
13890 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f  mplete header, o
138a0 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63  r.    ** it is c
138b0 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61  orrupted, then a
138c0 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f 66   process must of
138d0 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72   failed while wr
138e0 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a  iting it..    **
138f0 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   This indicates 
13900 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65  nothing more nee
13910 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ds to be rolled 
13920 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  back..    */.   
13930 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
13940 6c 48 64 72 28 70 50 61 67 65 72 2c 20 69 73 48  lHdr(pPager, isH
13950 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20  ot, szJ, &nRec, 
13960 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20  &mxPg);.    if( 
13970 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13980 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d   .      if( rc==
13990 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
139a0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
139b0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
139c0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
139d0 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20  ayback;.    }.. 
139e0 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
139f0 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
13a00 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  n this journal w
13a10 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
13a20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77  process.    ** w
13a30 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e  orking in no-syn
13a40 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61  c mode. This mea
13a50 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74  ns that the rest
13a60 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
13a70 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73      ** file cons
13a80 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74  ists of pages, t
13a90 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
13aa0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73   journal headers
13ab0 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a  . Compute.    **
13ac0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
13ad0 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73  ec based on this
13ae0 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20   assumption..   
13af0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
13b00 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a  ==0xffffffff ){.
13b10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
13b20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
13b30 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
13b40 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
13b50 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28    nRec = (int)((
13b60 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44  szJ - JOURNAL_HD
13b70 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f  R_SZ(pPager))/JO
13b80 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
13b90 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  er));.    }..   
13ba0 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30   /* If nRec is 0
13bb0 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61   and this rollba
13bc0 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73  ck is of a trans
13bd0 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62  action created b
13be0 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72  y this.    ** pr
13bf0 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74 68 69  ocess and if thi
13c00 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68  s is the final h
13c10 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75  eader in the jou
13c20 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65  rnal, then it me
13c30 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ans.    ** that 
13c40 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  this part of the
13c50 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69   journal was bei
13c60 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61  ng filled but ha
13c70 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20  s not yet been. 
13c80 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20     ** synced to 
13c90 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74  disk.  Compute t
13ca0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
13cb0 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  es based on the 
13cc0 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a  remaining.    **
13cd0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
13ce0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
13cf0 20 54 68 65 20 74 68 69 72 64 20 74 65 72 6d 20   The third term 
13d00 6f 66 20 74 68 65 20 74 65 73 74 20 77 61 73 20  of the test was 
13d10 61 64 64 65 64 20 74 6f 20 66 69 78 20 74 69 63  added to fix tic
13d20 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a  ket #2565..    *
13d30 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62  * When rolling b
13d40 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  ack a hot journa
13d50 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79  l, nRec==0 alway
13d60 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
13d70 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68 75   next.    ** chu
13d80 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nk of the journa
13d90 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20  l contains zero 
13da0 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c  pages to be roll
13db0 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20 20  ed back.  But.  
13dc0 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20    ** when doing 
13dd0 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74  a ROLLBACK and t
13de0 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b  he nRec==0 chunk
13df0 20 69 73 20 74 68 65 20 6c 61 73 74 20 63 68 75   is the last chu
13e00 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  nk in.    ** the
13e10 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61   journal, it mea
13e20 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ns that the jour
13e30 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  nal might contai
13e40 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20  n additional.   
13e50 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 6e   ** pages that n
13e60 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eed to be rolled
13e70 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74   back and that t
13e80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
13e90 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c  es .    ** shoul
13ea0 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62 61  d be computed ba
13eb0 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  sed on the journ
13ec0 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20  al file size..  
13ed0 20 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73    */.    testcas
13ee0 65 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69  e( nRec==0 && !i
13ef0 73 48 6f 74 0a 20 20 20 20 20 20 20 20 20 26 26  sHot.         &&
13f00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13f10 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
13f20 53 5a 28 70 50 61 67 65 72 29 21 3d 70 50 61 67  SZ(pPager)!=pPag
13f30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20  er->journalOff. 
13f40 20 20 20 20 20 20 20 20 26 26 20 28 28 73 7a 4a          && ((szJ
13f50 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
13f60 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c  alOff) / JOURNAL
13f70 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3e  _PG_SZ(pPager))>
13f80 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 61  0.         && pa
13f90 67 65 72 4e 65 78 74 4a 6f 75 72 6e 61 6c 50 61  gerNextJournalPa
13fa0 67 65 49 73 56 61 6c 69 64 28 70 50 61 67 65 72  geIsValid(pPager
13fb0 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ).    );.    if(
13fc0 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48   nRec==0 && !isH
13fd0 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70 50  ot &&.        pP
13fe0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
13ff0 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
14000 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
14010 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20  >journalOff ){. 
14020 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74       nRec = (int
14030 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  )((szJ - pPager-
14040 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a  >journalOff) / J
14050 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
14060 67 65 72 29 29 3b 0a 20 20 20 20 20 20 69 73 55  ger));.      isU
14070 6e 73 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 7d  nsync = 1;.    }
14080 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
14090 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65   is the first he
140a0 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74  ader read from t
140b0 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e  he journal, trun
140c0 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  cate the.    ** 
140d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61  database file ba
140e0 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
140f0 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  al size..    */.
14100 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
14110 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
14120 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
14130 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
14140 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
14150 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20  pPager, mxPg);. 
14160 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
14170 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14180 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
14190 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ack;.      }.   
141a0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
141b0 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a  e = mxPg;.    }.
141c0 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69  .    /* Copy ori
141d0 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20  ginal pages out 
141e0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
141f0 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
14200 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73   .    ** databas
14210 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61  e file and/or pa
14220 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f  ge cache..    */
14230 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c  .    for(u=0; u<
14240 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20  nRec; u++){.    
14250 20 20 69 66 28 20 6e 65 65 64 50 61 67 65 72 52    if( needPagerR
14260 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  eset ){.        
14270 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
14280 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65  er);.        nee
14290 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b  dPagerReset = 0;
142a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
142b0 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
142c0 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
142d0 65 72 2c 31 2c 69 73 55 6e 73 79 6e 63 2c 26 70  er,1,isUnsync,&p
142e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
142f0 66 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 69 66  f,0,0);.      if
14300 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14310 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
14320 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
14330 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
14340 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
14350 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
14360 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
14370 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
14380 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
14390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
143a0 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
143b0 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20   rollback, quit 
143c0 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65  and return the e
143d0 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a  rror.          *
143e0 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69  * code.  This wi
143f0 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70 61 67  ll cause the pag
14400 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
14410 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20  error state.    
14420 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74        ** so that
14430 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d   no further harm
14440 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20   will be done.  
14450 50 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74  Perhaps the next
14460 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
14470 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c  ocess to come al
14480 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65  ong will be able
14490 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
144a0 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
144b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
144c0 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
144d0 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ack;.        }. 
144e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
144f0 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a  .  /*NOTREACHED*
14500 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b  /.  assert( 0 );
14510 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a  ..end_playback:.
14520 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61    /* Following a
14530 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64   rollback, the d
14540 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
14550 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69  uld be back in i
14560 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  ts original.  **
14570 20 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20   state prior to 
14580 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
14590 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f   transaction, so
145a0 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a   invoke the.  **
145b0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42   SQLITE_FCNTL_DB
145c0 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d  _UNCHANGED file-
145d0 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74  control method t
145e0 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20  o disable the.  
145f0 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61  ** assertion tha
14600 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
14610 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f  n counter was mo
14620 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  dified..  */.  a
14630 73 73 65 72 74 28 0a 20 20 20 20 70 50 61 67 65  ssert(.    pPage
14640 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 3d  r->fd->pMethods=
14650 3d 30 20 7c 7c 0a 20 20 20 20 73 71 6c 69 74 65  =0 ||.    sqlite
14660 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  3OsFileControl(p
14670 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45  Pager->fd,SQLITE
14680 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e  _FCNTL_DB_UNCHAN
14690 47 45 44 2c 30 29 3e 3d 53 51 4c 49 54 45 5f 4f  GED,0)>=SQLITE_O
146a0 4b 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  K.  );..  /* If 
146b0 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73  this playback is
146c0 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d   happening autom
146d0 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65  atically as a re
146e0 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72  sult of an IO or
146f0 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72   .  ** malloc er
14700 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 72 65  ror that occurre
14710 64 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e  d after the chan
14720 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75  ge-counter was u
14730 70 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a  pdated but .  **
14740 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
14750 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d  saction was comm
14760 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20  itted, then the 
14770 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a  change-counter .
14780 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f    ** modificatio
14790 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20  n may just have 
147a0 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49  been reverted. I
147b0 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 69  f this happens i
147c0 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a  n exclusive .  *
147d0 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62  * mode, then sub
147e0 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74  sequent transact
147f0 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62  ions performed b
14800 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  y the connection
14810 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75   will not.  ** u
14820 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
14830 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e  -counter at all.
14840 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74   This may lead t
14850 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73  o cache inconsis
14860 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c  tency.  ** probl
14870 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72  ems for other pr
14880 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20  ocesses at some 
14890 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
148a0 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20  ure. So, just.  
148b0 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73 20  ** in case this 
148c0 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c  has happened, cl
148d0 65 61 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f  ear the changeCo
148e0 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77  untDone flag now
148f0 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
14900 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
14910 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
14920 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ile;..  if( rc==
14930 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14940 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65   zMaster = pPage
14950 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
14960 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
14970 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
14980 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
14990 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
149a0 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20  athname+1);.    
149b0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
149c0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
149d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
149e0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
149f0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
14a00 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61  tion(pPager, zMa
14a10 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a  ster[0]!='\0');.
14a20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
14a30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
14a40 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
14a50 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65  ITE_OK && zMaste
14a60 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20  r[0] && res ){. 
14a70 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
14a80 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  as a master jour
14a90 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75  nal and this rou
14aa0 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
14ab0 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a   success,.    **
14ac0 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f   see if it is po
14ad0 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
14ae0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
14af0 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nal..    */.    
14b00 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61  rc = pager_delma
14b10 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61  ster(pPager, zMa
14b20 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63  ster);.    testc
14b30 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
14b40 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OK );.  }..  /* 
14b50 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  The Pager.sector
14b60 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
14b70 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61  y have been upda
14b80 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e  ted while rollin
14b90 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f  g.  ** back a jo
14ba0 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79  urnal created by
14bb0 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20   a process with 
14bc0 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63 74  a different sect
14bd0 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c  or size.  ** val
14be0 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20  ue. Reset it to 
14bf0 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75  the correct valu
14c00 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
14c10 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65  ss..  */.  setSe
14c20 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
14c30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14c40 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
14c50 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65   savepoint pSave
14c60 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53  point. Or, if pS
14c70 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20  avepoint==NULL, 
14c80 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a  then playback.**
14c90 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74   the entire mast
14ca0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
14cb0 20 54 68 65 20 63 61 73 65 20 70 53 61 76 65 70   The case pSavep
14cc0 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72  oint==NULL occur
14cd0 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c  s when .** a ROL
14ce0 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64  LBACK TO command
14cf0 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61   is invoked on a
14d00 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20   SAVEPOINT that 
14d10 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
14d20 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a   .** savepoint..
14d30 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65  **.** When pSave
14d40 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  point is not NUL
14d50 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e  L (meaning a non
14d60 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76  -transaction sav
14d70 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65  epoint is .** be
14d80 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29  ing rolled back)
14d90 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62  , then the rollb
14da0 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ack consists of 
14db0 75 70 20 74 6f 20 74 68 72 65 65 20 73 74 61 67  up to three stag
14dc0 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64  es,.** performed
14dd0 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70   in the order sp
14de0 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  ecified:.**.**  
14df0 20 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c 61   * Pages are pla
14e00 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
14e10 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
14e20 74 61 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a  tarting at byte.
14e30 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50 61  **     offset Pa
14e40 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66  gerSavepoint.iOf
14e50 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75  fset and continu
14e60 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50  ing to .**     P
14e70 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
14e80 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20  drOffset, or to 
14e90 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
14ea0 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ain journal.**  
14eb0 20 20 20 66 69 6c 65 20 69 66 20 50 61 67 65 72     file if Pager
14ec0 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
14ed0 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a  fset is zero..**
14ee0 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72  .**   * If Pager
14ef0 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
14f00 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f  fset is not zero
14f10 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65  , then pages are
14f20 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62   played.**     b
14f30 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f  ack starting fro
14f40 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
14f50 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  ader immediately
14f60 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20   following .**  
14f70 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
14f80 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20  t.iHdrOffset to 
14f90 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
14fa0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
14fb0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65  ..**.**   * Page
14fc0 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65  s are then playe
14fd0 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
14fe0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
14ff0 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20  , starting.**   
15000 20 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72    with the Pager
15010 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65  Savepoint.iSubRe
15020 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  c and continuing
15030 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a   to the end of.*
15040 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61  *     the journa
15050 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  l file..**.** Th
15060 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c  roughout the rol
15070 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65  lback process, e
15080 61 63 68 20 74 69 6d 65 20 61 20 70 61 67 65 20  ach time a page 
15090 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
150a0 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  the.** correspon
150b0 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20  ding bit is set 
150c0 69 6e 20 61 20 62 69 74 76 65 63 20 73 74 72 75  in a bitvec stru
150d0 63 74 75 72 65 20 28 76 61 72 69 61 62 6c 65 20  cture (variable 
150e0 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20  pDone in the.** 
150f0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62  implementation b
15100 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75  elow). This is u
15110 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  sed to ensure th
15120 61 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c  at a page is onl
15130 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y.** rolled back
15140 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
15150 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  it is encountere
15160 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72  d in either jour
15170 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53  nal..**.** If pS
15180 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c  avepoint is NULL
15190 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65  , then pages are
151a0 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63   only played bac
151b0 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a  k from the main.
151c0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
151d0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
151e0 64 20 66 6f 72 20 61 20 62 69 74 76 65 63 20 69  d for a bitvec i
151f0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
15200 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ** In either cas
15210 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61  e, before playba
15220 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65  ck commences the
15230 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61   Pager.dbSize va
15240 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73  riable.** is res
15250 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
15260 74 68 61 74 20 69 74 20 68 65 6c 64 20 61 74 20  that it held at 
15270 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
15280 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28   savepoint .** (
15290 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  or transaction).
152a0 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61 20   No page with a 
152b0 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61  page-number grea
152c0 74 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61  ter than this va
152d0 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64  lue.** is played
152e0 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73   back. If one is
152f0 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20   encountered it 
15300 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65  is simply skippe
15310 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
15320 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61   pagerPlaybackSa
15330 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70  vepoint(Pager *p
15340 50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76 65  Pager, PagerSave
15350 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e  point *pSavepoin
15360 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  t){.  i64 szJ;  
15370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15380 2a 20 45 66 66 65 63 74 69 76 65 20 73 69 7a 65  * Effective size
15390 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
153a0 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48  rnal */.  i64 iH
153b0 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
153c0 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72     /* End of fir
153d0 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61  st segment of ma
153e0 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  in-journal recor
153f0 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ds */.  int rc =
15400 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
15410 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
15420 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f  */.  Bitvec *pDo
15430 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ne = 0;       /*
15440 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72   Bitvec to ensur
15450 65 20 70 61 67 65 73 20 70 6c 61 79 65 64 20 62  e pages played b
15460 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f  ack only once */
15470 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
15480 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
15490 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a  _SHARED );..  /*
154a0 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76   Allocate a bitv
154b0 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f  ec to use to sto
154c0 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 70 61  re the set of pa
154d0 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ges rolled back 
154e0 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
154f0 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65  int ){.    pDone
15500 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
15510 43 72 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e  Create(pSavepoin
15520 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69  t->nOrig);.    i
15530 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20  f( !pDone ){.   
15540 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15550 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
15560 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
15570 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 61  database size ba
15580 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ck to the value 
15590 69 74 20 77 61 73 20 62 65 66 6f 72 65 20 74 68  it was before th
155a0 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a  e savepoint .  *
155b0 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74 65 64  * being reverted
155c0 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a   was opened..  *
155d0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
155e0 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20  ze = pSavepoint 
155f0 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f  ? pSavepoint->nO
15600 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62  rig : pPager->db
15610 4f 72 69 67 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20  OrigSize;..  /* 
15620 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  Use pPager->jour
15630 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66  nalOff as the ef
15640 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20  fective size of 
15650 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  the main rollbac
15660 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20  k.  ** journal. 
15670 20 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   The actual file
15680 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72   might be larger
15690 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20   than this in.  
156a0 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ** PAGER_JOURNAL
156b0 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72  MODE_TRUNCATE or
156c0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
156d0 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74  DE_PERSIST.  But
156e0 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70   anything.  ** p
156f0 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ast pPager->jour
15700 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69  nalOff is off-li
15710 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f  mits to us..  */
15720 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d  .  szJ = pPager-
15730 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
15740 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c  /* Begin by roll
15750 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73  ing back records
15760 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
15770 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
15780 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76  at.  ** PagerSav
15790 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61  epoint.iOffset a
157a0 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f  nd continuing to
157b0 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61   the next journa
157c0 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54  l header..  ** T
157d0 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 72 65  here might be re
157e0 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69  cords in the mai
157f0 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68  n journal that h
15800 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ave a page numbe
15810 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74  r.  ** greater t
15820 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
15830 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 28 70  database size (p
15840 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62  Pager->dbSize) b
15850 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69  ut those.  ** wi
15860 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61 75  ll be skipped au
15870 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61  tomatically.  Pa
15880 67 65 73 20 61 72 65 20 61 64 64 65 64 20 74 6f  ges are added to
15890 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20   pDone as they. 
158a0 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62   ** are played b
158b0 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ack..  */.  if( 
158c0 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
158d0 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76    iHdrOff = pSav
158e0 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
158f0 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d  et ? pSavepoint-
15900 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a  >iHdrOffset : sz
15910 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  J;.    pPager->j
15920 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76  ournalOff = pSav
15930 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b  epoint->iOffset;
15940 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
15950 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
15960 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
15970 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20  iHdrOff ){.     
15980 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
15990 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
159a0 61 67 65 72 2c 20 31 2c 20 30 2c 20 26 70 50 61  ager, 1, 0, &pPa
159b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
159c0 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20 20   1, pDone);.    
159d0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
159e0 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
159f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
15a00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15a10 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
15a20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67  Continue rolling
15a30 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75   back records ou
15a40 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  t of the main jo
15a50 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
15a60 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  t.  ** the first
15a70 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
15a80 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75  seen and continu
15a90 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66  ing until the ef
15aa0 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a  fective end.  **
15ab0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
15ac0 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74  rnal file.  Cont
15ad0 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74  inue to skip out
15ae0 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
15af0 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75  and.  ** continu
15b00 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20 72  e adding pages r
15b10 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44  olled back to pD
15b20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  one..  */.  whil
15b30 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
15b40 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
15b50 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20  nalOff<szJ ){.  
15b60 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
15b70 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
15b80 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20  nter */.    u32 
15b90 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f  nJRec = 0;     /
15ba0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72  * Number of Jour
15bb0 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20  nal Records */. 
15bc0 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
15bd0 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
15be0 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c  alHdr(pPager, 0,
15bf0 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64   szJ, &nJRec, &d
15c00 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72  ummy);.    asser
15c10 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
15c20 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  NE );..    /*.  
15c30 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72    ** The "pPager
15c40 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
15c50 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
15c60 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
15c70 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20  rnalOff".    ** 
15c80 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20  test is related 
15c90 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  to ticket #2565.
15ca0 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73    See the discus
15cb0 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  sion in the.    
15cc0 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  ** pager_playbac
15cd0 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  k() function for
15ce0 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
15cf0 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  rmation..    */.
15d00 20 20 20 20 61 73 73 65 72 74 28 20 21 28 6e 4a      assert( !(nJ
15d10 52 65 63 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  Rec==0.         
15d20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
15d30 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
15d40 52 5f 53 5a 28 70 50 61 67 65 72 29 21 3d 70 50  R_SZ(pPager)!=pP
15d50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15d60 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28 73  .         && ((s
15d70 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
15d80 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e  rnalOff) / JOURN
15d90 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
15da0 29 3e 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  )>0.         && 
15db0 70 61 67 65 72 4e 65 78 74 4a 6f 75 72 6e 61 6c  pagerNextJournal
15dc0 50 61 67 65 49 73 56 61 6c 69 64 28 70 50 61 67  PageIsValid(pPag
15dd0 65 72 29 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  er)).    );.    
15de0 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20  if( nJRec==0 .  
15df0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
15e00 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
15e10 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
15e20 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
15e30 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Off.    ){.     
15e40 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28   nJRec = (u32)((
15e50 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
15e60 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41  urnalOff)/JOURNA
15e70 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
15e80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
15e90 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ii=0; rc==SQLITE
15ea0 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20  _OK && ii<nJRec 
15eb0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
15ec0 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29  alOff<szJ; ii++)
15ed0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
15ee0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
15ef0 70 61 67 65 28 70 50 61 67 65 72 2c 20 31 2c 20  page(pPager, 1, 
15f00 30 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  0, &pPager->jour
15f10 6e 61 6c 4f 66 66 2c 20 31 2c 20 70 44 6f 6e 65  nalOff, 1, pDone
15f20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
15f30 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
15f40 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73  DONE );.  }.  as
15f50 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
15f60 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  _OK || pPager->j
15f70 6f 75 72 6e 61 6c 4f 66 66 3d 3d 73 7a 4a 20 29  ournalOff==szJ )
15f80 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c  ;..  /* Finally,
15f90 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73    rollback pages
15fa0 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
15fb0 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61  urnal.  Page tha
15fc0 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76  t were.  ** prev
15fd0 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61  iously rolled ba
15fe0 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ck out of the ma
15ff0 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  in journal (and 
16000 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f  are hence in pDo
16010 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ne).  ** will be
16020 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f   skipped.  Out-o
16030 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 72  f-range pages ar
16040 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a  e also skipped..
16050 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65    */.  if( pSave
16060 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32  point ){.    u32
16070 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
16080 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
16090 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  */.    i64 offse
160a0 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t = pSavepoint->
160b0 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65  iSubRec*(4+pPage
160c0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
160d0 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f    for(ii=pSavepo
160e0 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63  int->iSubRec; rc
160f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
16100 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  i<pPager->nSubRe
16110 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
16120 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d  assert( offset==
16130 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ii*(4+pPager->pa
16140 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20  geSize) );.     
16150 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
16160 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
16170 61 67 65 72 2c 20 30 2c 20 30 2c 20 26 6f 66 66  ager, 0, 0, &off
16180 73 65 74 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a  set, 1, pDone);.
16190 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
161a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
161b0 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  E );.  }..  sqli
161c0 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
161d0 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72  (pDone);.  if( r
161e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
161f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
16200 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
16210 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
16220 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
16230 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
16240 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
16250 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c  ages that are al
16260 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  lowed..*/.void s
16270 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
16280 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  chesize(Pager *p
16290 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
162a0 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  e){.  sqlite3Pca
162b0 63 68 65 53 65 74 43 61 63 68 65 73 69 7a 65 28  cheSetCachesize(
162c0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
162d0 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a   mxPage);.}../*.
162e0 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f  ** Adjust the ro
162f0 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20  bustness of the 
16300 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61  database to dama
16310 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
16320 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72  shes.** or power
16330 20 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61   failures by cha
16340 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nging the number
16350 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65   of syncs()s whe
16360 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  n writing.** the
16370 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
16380 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68  l.  There are th
16390 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a  ree levels:.**.*
163a0 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73  *    OFF       s
163b0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69  qlite3OsSync() i
163c0 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20  s never called. 
163d0 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
163e0 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ault.**         
163f0 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61       for tempora
16400 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74  ry and transient
16410 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
16420 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a   NORMAL    The j
16430 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
16440 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69   once before wri
16450 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
16460 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
16470 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
16480 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65   is normally ade
16490 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e  quate protection
164a0 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  , but.**        
164b0 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f        it is theo
164c0 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62  retically possib
164d0 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20  le, though very 
164e0 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20  unlikely,.**    
164f0 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61            that a
16500 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77  n inopertune pow
16510 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
16520 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e   leave the journ
16530 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
16540 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68     in a state wh
16550 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20  ich would cause 
16560 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
16570 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20  tabase.**       
16580 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69         when it i
16590 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
165a0 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20  *.**    FULL    
165b0 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
165c0 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65   synced twice be
165d0 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
165e0 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
165f0 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
16600 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64  e (with some add
16610 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
16620 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66  ion - the nRec f
16630 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  ield.**         
16640 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72       of the jour
16650 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69  nal header - bei
16660 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65  ng written in be
16670 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a  tween the two.**
16680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79                sy
16690 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73  ncs).  If we ass
166a0 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67  ume that writing
166b0 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   a.**           
166c0 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73     single disk s
166d0 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c  ector is atomic,
166e0 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20   then this mode 
166f0 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20  provides.**     
16700 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e           assuran
16710 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ce that the jour
16720 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nal will not be 
16730 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65  corrupted to the
16740 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
16750 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e   point of causin
16760 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  g damage to the 
16770 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20  database during 
16780 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
16790 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61  Numeric values a
167a0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
167b0 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20  hese states are 
167c0 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32  OFF==1, NORMAL=2
167d0 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e  ,.** and FULL=3.
167e0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
167f0 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
16800 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74  AGMAS.void sqlit
16810 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79  e3PagerSetSafety
16820 4c 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61  Level(Pager *pPa
16830 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20  ger, int level, 
16840 69 6e 74 20 62 46 75 6c 6c 46 73 79 6e 63 29 7b  int bFullFsync){
16850 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
16860 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c  c =  (level==1 |
16870 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
16880 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67  le) ?1:0;.  pPag
16890 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28  er->fullSync = (
168a0 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61  level==3 && !pPa
168b0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f  ger->tempFile) ?
168c0 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  1:0;.  pPager->s
168d0 79 6e 63 5f 66 6c 61 67 73 20 3d 20 28 62 46 75  ync_flags = (bFu
168e0 6c 6c 46 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53  llFsync?SQLITE_S
168f0 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f  YNC_FULL:SQLITE_
16900 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20  SYNC_NORMAL);.  
16910 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
16920 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65  nc ) pPager->nee
16930 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e  dSync = 0;.}.#en
16940 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
16950 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
16960 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72  variable is incr
16970 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72  emented whenever
16980 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20   the library.** 
16990 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e  attempts to open
169a0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
169b0 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  e.  This informa
169c0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
169d0 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
169e0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20  analysis only.  
169f0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
16a00 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
16a10 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
16a20 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
16a30 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70  *.** Open a temp
16a40 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  orary file..**.*
16a50 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
16a60 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
16a70 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20   *pFile. Return 
16a80 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
16a90 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65  cess .** or some
16aa0 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
16ab0 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68  e if we fail. Th
16ac0 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61  e OS will automa
16ad0 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65  tically .** dele
16ae0 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
16af0 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
16b00 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
16b10 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  he flags passed 
16b20 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72  to the VFS layer
16b30 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72   xOpen() call ar
16b40 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  e those specifie
16b50 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65  d.** by paramete
16b60 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20  r vfsFlags ORed 
16b70 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
16b80 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51  ng:.**.**     SQ
16b90 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
16ba0 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ITE.**     SQLIT
16bb0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a  E_OPEN_CREATE.**
16bc0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
16bd0 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20  _EXCLUSIVE.**   
16be0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45    SQLITE_OPEN_DE
16bf0 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73  LETEONCLOSE.*/.s
16c00 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f  tatic int pagerO
16c10 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72  pentemp(.  Pager
16c20 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
16c30 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62   /* The pager ob
16c40 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
16c50 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
16c60 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  /* Write the fil
16c70 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72  e descriptor her
16c80 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
16c90 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ags          /* 
16ca0 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
16cb0 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20  ough to the VFS 
16cc0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
16cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16ce0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
16cf0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
16d00 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  EST.  sqlite3_op
16d10 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20  entemp_count++; 
16d20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73   /* Used for tes
16d30 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
16d40 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66  s only */.#endif
16d50 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20  ..  vfsFlags |= 
16d60 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
16d70 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
16d80 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
16d90 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
16da0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
16db0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  | SQLITE_OPEN_DE
16dc0 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72  LETEONCLOSE;.  r
16dd0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
16de0 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  n(pPager->pVfs, 
16df0 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61  0, pFile, vfsFla
16e00 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  gs, 0);.  assert
16e10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16e20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29  || isOpen(pFile)
16e30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
16e40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
16e50 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
16e60 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  unction..**.** T
16e70 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73  he pager invokes
16e80 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
16e90 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f  r if sqlite3OsLo
16ea0 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a  ck() returns .**
16eb0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65   SQLITE_BUSY whe
16ec0 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72  n trying to upgr
16ed0 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b  ade from no-lock
16ee0 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63   to a SHARED loc
16ef0 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72  k,.** or when tr
16f00 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20  ying to upgrade 
16f10 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20  from a RESERVED 
16f20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55  lock to an EXCLU
16f30 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49  SIVE .** lock. I
16f40 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76  t does *not* inv
16f50 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
16f60 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61 64  dler when upgrad
16f70 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52  ing from.** SHAR
16f80 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20  ED to RESERVED, 
16f90 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  or when upgradin
16fa0 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f  g from SHARED to
16fb0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77   EXCLUSIVE.** (w
16fc0 68 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69  hich occurs duri
16fd0 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ng hot-journal r
16fe0 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72  ollback). Summar
16ff0 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73  y:.**.**   Trans
17000 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20  ition           
17010 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 49               | I
17020 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64  nvokes xBusyHand
17030 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ler.**   -------
17040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17070 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20  -.**   NO_LOCK  
17080 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c       -> SHARED_L
17090 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a  OCK      | Yes.*
170a0 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  *   SHARED_LOCK 
170b0 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f    -> RESERVED_LO
170c0 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20  CK    | No.**   
170d0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e  SHARED_LOCK   ->
170e0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
170f0 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45    | No.**   RESE
17100 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43  RVED_LOCK -> EXC
17110 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20  LUSIVE_LOCK   | 
17120 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  Yes.**.** If the
17130 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
17140 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e  llback returns n
17150 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63  on-zero, the loc
17160 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64  k is .** retried
17170 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20  . If it returns 
17180 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53  zero, then the S
17190 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
171a0 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
171b0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66  to the caller of
171c0 20 74 68 65 20 70 61 67 65 72 20 41 50 49 20 66   the pager API f
171d0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  unction..*/.void
171e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
171f0 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50  Busyhandler(.  P
17200 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
17210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17220 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
17230 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ect */.  int (*x
17240 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69  BusyHandler)(voi
17250 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a  d *),         /*
17260 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79   Pointer to busy
17270 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f  -handler functio
17280 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  n */.  void *pBu
17290 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20  syHandlerArg    
172a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
172b0 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20  rgument to pass 
172c0 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  to xBusyHandler 
172d0 2a 2f 0a 29 7b 20 20 0a 20 20 70 50 61 67 65 72  */.){  .  pPager
172e0 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->xBusyHandler =
172f0 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20   xBusyHandler;. 
17300 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
17310 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79  ndlerArg = pBusy
17320 48 61 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f  HandlerArg;.}../
17330 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20  *.** Report the 
17340 63 75 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a  current page siz
17350 65 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20  e and number of 
17360 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 62  reserved bytes b
17370 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f  ack.** to the co
17380 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  dec..*/.#ifdef S
17390 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
173a0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
173b0 72 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65  rReportSize(Page
173c0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
173d0 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ( pPager->xCodec
173e0 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20  SizeChng ){.    
173f0 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69  pPager->xCodecSi
17400 7a 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70  zeChng(pPager->p
17410 43 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70  Codec, pPager->p
17420 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ageSize,.       
17430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17440 20 20 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d      (int)pPager-
17450 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a  >nReserve);.  }.
17460 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
17470 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
17480 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70  (X)     /* No-op
17490 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75   if we do not su
174a0 70 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f  pport a codec */
174b0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
174c0 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 73  hange the page s
174d0 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
174e0 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68  Pager object. Th
174f0 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  e new page size 
17500 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e  .** is passed in
17510 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a   *pPageSize..**.
17520 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
17530 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
17540 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
17550 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
17560 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e  ed, it.** is a n
17570 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20  o-op. The value 
17580 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
17590 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f  error state erro
175a0 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a  r code (i.e. .**
175b0 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49   one of SQLITE_I
175c0 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52  OERR, SQLITE_COR
175d0 52 55 50 54 20 6f 72 20 53 51 4c 49 54 45 5f 46  RUPT or SQLITE_F
175e0 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ULL)..**.** Othe
175f0 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66  rwise, if all of
17600 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
17610 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
17620 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 20   * the new page 
17630 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a  size (value of *
17640 70 50 61 67 65 53 69 7a 65 29 20 69 73 20 76 61  pPageSize) is va
17650 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a  lid (a power .**
17660 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77       of two betw
17670 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49  een 512 and SQLI
17680 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
17690 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e  , inclusive), an
176a0 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72  d.**.**   * ther
176b0 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
176c0 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65  ding page refere
176d0 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  nces, and.**.** 
176e0 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65    * the database
176f0 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61   is either not a
17700 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
17710 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a  base or it is.**
17720 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72       an in-memor
17730 79 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  y database that 
17740 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73  currently consis
17750 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73  ts of zero pages
17760 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ..**.** then the
17770 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61   pager object pa
17780 67 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74  ge size is set t
17790 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a  o *pPageSize..**
177a0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
177b0 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c  size is changed,
177c0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
177d0 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33  ion uses sqlite3
177e0 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a  PagerMalloc() .*
177f0 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65  * to obtain a ne
17800 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  w Pager.pTmpSpac
17810 65 20 62 75 66 66 65 72 2e 20 49 66 20 74 68 69  e buffer. If thi
17820 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74  s allocation att
17830 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20  empt .** fails, 
17840 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
17850 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
17860 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69   page size remai
17870 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a  ns unchanged. .*
17880 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63  * In all other c
17890 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ases, SQLITE_OK 
178a0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
178b0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73  ** If the page s
178c0 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67  ize is not chang
178d0 65 64 2c 20 65 69 74 68 65 72 20 62 65 63 61 75  ed, either becau
178e0 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e  se one of the en
178f0 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64  umerated.** cond
17900 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20  itions above is 
17910 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70 61  not true, the pa
17920 67 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72  ger was in error
17930 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
17940 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  .** function was
17950 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61   called, or beca
17960 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  use the memory a
17970 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70  llocation attemp
17980 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68  t failed, .** th
17990 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73  en *pPageSize is
179a0 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c   set to the old,
179b0 20 72 65 74 61 69 6e 65 64 20 70 61 67 65 20 73   retained page s
179c0 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ize before retur
179d0 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ning..*/.int sql
179e0 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
179f0 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
17a00 65 72 2c 20 75 31 36 20 2a 70 50 61 67 65 53 69  er, u16 *pPageSi
17a10 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
17a20 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 50  ){.  int rc = pP
17a30 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
17a40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
17a50 3e 64 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20  >dbSize==0 );.  
17a60 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
17a70 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
17a80 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
17a90 30 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  0 );.  if( rc==S
17aa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17ab0 75 31 36 20 70 61 67 65 53 69 7a 65 20 3d 20 2a  u16 pageSize = *
17ac0 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61  pPageSize;.    a
17ad0 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d  ssert( pageSize=
17ae0 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e  =0 || (pageSize>
17af0 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
17b00 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
17b10 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 20 20 69  E_SIZE) );.    i
17b20 66 28 20 70 61 67 65 53 69 7a 65 20 26 26 20 70  f( pageSize && p
17b30 61 67 65 53 69 7a 65 21 3d 70 50 61 67 65 72 2d  ageSize!=pPager-
17b40 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 20 20 20  >pageSize .     
17b50 26 26 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44  && (pPager->memD
17b60 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  b==0 || pPager->
17b70 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 20 20  dbSize==0).     
17b80 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  && sqlite3Pcache
17b90 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
17ba0 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20  >pPCache)==0 .  
17bb0 20 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20    ){.      char 
17bc0 2a 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29  *pNew = (char *)
17bd0 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
17be0 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  c(pageSize);.   
17bf0 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a     if( !pNew ){.
17c00 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
17c10 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
17c20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17c30 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
17c40 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  er);.        pPa
17c50 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
17c60 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
17c70 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
17c80 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  e(pPager->pTmpSp
17c90 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70 50  ace);.        pP
17ca0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
17cb0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = pNew;.        
17cc0 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
17cd0 50 61 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d  PageSize(pPager-
17ce0 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 53 69  >pPCache, pageSi
17cf0 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
17d00 20 7d 0a 20 20 20 20 2a 70 50 61 67 65 53 69 7a   }.    *pPageSiz
17d10 65 20 3d 20 28 75 31 36 29 70 50 61 67 65 72 2d  e = (u16)pPager-
17d20 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 69  >pageSize;.    i
17d30 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 20  f( nReserve<0 ) 
17d40 6e 52 65 73 65 72 76 65 20 3d 20 70 50 61 67 65  nReserve = pPage
17d50 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20  r->nReserve;.   
17d60 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76   assert( nReserv
17d70 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65  e>=0 && nReserve
17d80 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 70 50 61  <1000 );.    pPa
17d90 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20  ger->nReserve = 
17da0 28 69 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20  (i16)nReserve;. 
17db0 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69     pagerReportSi
17dc0 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ze(pPager);.  }.
17dd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17de0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
17df0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74  ointer to the "t
17e00 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20 62  emporary page" b
17e10 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72  uffer held inter
17e20 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20  nally.** by the 
17e30 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73 20  pager.  This is 
17e40 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69 73  a buffer that is
17e50 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
17e60 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72  old the.** entir
17e70 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64  e content of a d
17e80 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 54  atabase page.  T
17e90 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75 73  his buffer is us
17ea0 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ed internally.**
17eb0 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
17ec0 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65   and will be ove
17ed0 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65  rwritten wheneve
17ee0 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  r a rollback.** 
17ef0 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68  occurs.  But oth
17f00 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66  er modules are f
17f10 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f  ree to use it to
17f20 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a  o, as long as.**
17f30 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72   no rollbacks ar
17f40 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a  e happening..*/.
17f50 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
17f60 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67 65  erTempSpace(Page
17f70 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
17f80 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d  turn pPager->pTm
17f90 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pSpace;.}../*.**
17fa0 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   Attempt to set 
17fb0 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61  the maximum data
17fc0 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20  base page count 
17fd0 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
17fe0 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20  itive. .** Make 
17ff0 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78  no changes if mx
18000 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20  Page is zero or 
18010 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e  negative.  And n
18020 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65 0a  ever reduce the.
18030 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  ** maximum page 
18040 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20  count below the 
18050 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
18060 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
18070 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f  .** Regardless o
18080 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
18090 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78   the current max
180a0 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e  imum page count.
180b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
180c0 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
180d0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
180e0 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
180f0 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20  f( mxPage>0 ){. 
18100 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
18110 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a  o = mxPage;.  }.
18120 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
18130 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
18140 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  0);.  return pPa
18150 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a  ger->mxPgno;.}..
18160 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
18170 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69  ing set of routi
18180 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
18190 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75  disable the simu
181a0 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72  lated.** I/O err
181b0 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54  or mechanism.  T
181c0 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
181d0 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20  e used to avoid 
181e0 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72  simulated.** err
181f0 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68  ors in places wh
18200 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  ere we do not ca
18210 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e  re about errors.
18220 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44  .**.** Unless -D
18230 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73  SQLITE_TEST=1 is
18240 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75   used, these rou
18250 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f  tines are all no
18260 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65  -ops.** and gene
18270 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f  rate no code..*/
18280 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
18290 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  EST.extern int s
182a0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
182b0 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20  pending;.extern 
182c0 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
182d0 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63  rror_hit;.static
182e0 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a   int saved_cnt;.
182f0 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d  void disable_sim
18300 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
18310 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f  (void){.  saved_
18320 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f  cnt = sqlite3_io
18330 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
18340 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
18350 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b  or_pending = -1;
18360 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73  .}.void enable_s
18370 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
18380 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  rs(void){.  sqli
18390 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
183a0 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74  ding = saved_cnt
183b0 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
183c0 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  ne disable_simul
183d0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
183e0 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65  .# define enable
183f0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
18400 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f  rors().#endif../
18410 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69  *.** Read the fi
18420 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d  rst N bytes from
18430 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
18440 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20  f the file into 
18450 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70  memory.** that p
18460 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20  Dest points to. 
18470 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
18480 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  ger was opened o
18490 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69  n a transient fi
184a0 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22  le (zFilename=="
184b0 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64  "), or.** opened
184c0 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73 73 20   on a file less 
184d0 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69 6e 20  than N bytes in 
184e0 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70 75 74  size, the output
184f0 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65   buffer is.** ze
18500 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  roed and SQLITE_
18510 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65  OK returned. The
18520 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74   rationale for t
18530 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73  his is that this
18540 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73   .** function is
18550 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 64 61   used to read da
18560 74 61 62 61 73 65 20 68 65 61 64 65 72 73 2c 20  tabase headers, 
18570 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e 73 69  and a new transi
18580 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73  ent or.** zero s
18590 69 7a 65 64 20 64 61 74 61 62 61 73 65 20 68 61  ized database ha
185a0 73 20 61 20 68 65 61 64 65 72 20 74 68 61 6e 20  s a header than 
185b0 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c  consists entirel
185c0 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a  y of zeroes..**.
185d0 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65 72 72  ** If any IO err
185e0 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20 53 51  or apart from SQ
185f0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
18600 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75 6e 74  _READ is encount
18610 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72  ered,.** the err
18620 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
18630 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
18640 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e  r and the conten
18650 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74  ts of the.** out
18660 70 75 74 20 62 75 66 66 65 72 20 75 6e 64 65 66  put buffer undef
18670 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ined..*/.int sql
18680 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
18690 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70  eheader(Pager *p
186a0 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e  Pager, int N, un
186b0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65  signed char *pDe
186c0 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  st){.  int rc = 
186d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d  SQLITE_OK;.  mem
186e0 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29  set(pDest, 0, N)
186f0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
18700 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
18710 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
18720 6c 65 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70  le );.  if( isOp
18730 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
18740 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
18750 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22  DBHDR %p 0 %d\n"
18760 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20  , pPager, N)).  
18770 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
18780 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
18790 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20   pDest, N, 0);. 
187a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
187b0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
187c0 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  AD ){.      rc =
187d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
187e0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
187f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
18800 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  rn the total num
18810 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
18820 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18830 65 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a  e associated .**
18840 20 77 69 74 68 20 70 50 61 67 65 72 2e 20 4e 6f   with pPager. No
18850 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20  rmally, this is 
18860 63 61 6c 63 75 6c 61 74 65 64 20 61 73 20 28 3c  calculated as (<
18870 64 62 20 66 69 6c 65 20 73 69 7a 65 3e 2f 3c 70  db file size>/<p
18880 61 67 65 2d 73 69 7a 65 3e 29 2e 0a 2a 2a 20 48  age-size>)..** H
18890 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 66  owever, if the f
188a0 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20 31  ile is between 1
188b0 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e   and <page-size>
188c0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
188d0 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73  then .** this is
188e0 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20   considered a 1 
188f0 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  page file..**.**
18900 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
18910 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   in error state 
18920 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
18930 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
18940 65 6e 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 20  en the.** error 
18950 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  state error code
18960 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
18970 20 2a 70 6e 50 61 67 65 20 6c 65 66 74 20 75 6e   *pnPage left un
18980 63 68 61 6e 67 65 64 2e 20 4f 72 2c 0a 2a 2a 20  changed. Or,.** 
18990 69 66 20 74 68 65 20 66 69 6c 65 20 73 79 73 74  if the file syst
189a0 65 6d 20 68 61 73 20 74 6f 20 62 65 20 71 75 65  em has to be que
189b0 72 69 65 64 20 66 6f 72 20 74 68 65 20 73 69 7a  ried for the siz
189c0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e  e of the file an
189d0 64 0a 2a 2a 20 74 68 65 20 71 75 65 72 79 20 61  d.** the query a
189e0 74 74 65 6d 70 74 20 72 65 74 75 72 6e 73 20 61  ttempt returns a
189f0 6e 20 49 4f 20 65 72 72 6f 72 2c 20 74 68 65 20  n IO error, the 
18a00 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
18a10 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64   returned.** and
18a20 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74   *pnPage is left
18a30 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
18a40 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
18a50 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
18a60 63 63 65 73 73 66 75 6c 2c 20 74 68 65 6e 20 53  ccessful, then S
18a70 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
18a80 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a 70 6e 50  rned.** and *pnP
18a90 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  age is set to th
18aa0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
18ab0 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
18ac0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
18ad0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
18ae0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
18af0 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50  nt *pnPage){.  P
18b00 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20  gno nPage;      
18b10 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
18b20 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20  e to return via 
18b30 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a  *pnPage */..  /*
18b40 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
18b50 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
18b60 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74  error state, ret
18b70 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
18b80 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  de. */.  if( pPa
18b90 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
18ba0 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
18bb0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
18bc0 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .  /* Determine 
18bd0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
18be0 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  ges in the file.
18bf0 20 53 74 6f 72 65 20 74 68 69 73 20 69 6e 20 6e   Store this in n
18c00 50 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70  Page. */.  if( p
18c10 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
18c20 69 64 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20  id ){.    nPage 
18c30 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
18c40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
18c50 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
18c60 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
18c70 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 46 69  returned by OsFi
18c80 6c 65 53 69 7a 65 28 29 20 2a 2f 0a 20 20 20 20  leSize() */.    
18c90 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20  i64 n = 0;      
18ca0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
18cb0 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 72 65  size in bytes re
18cc0 74 75 72 6e 65 64 20 62 79 20 4f 73 46 69 6c 65  turned by OsFile
18cd0 53 69 7a 65 28 29 20 2a 2f 0a 0a 20 20 20 20 61  Size() */..    a
18ce0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
18cf0 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
18d00 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
18d10 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28  .    if( isOpen(
18d20 70 50 61 67 65 72 2d 3e 66 64 29 20 26 26 20 28  pPager->fd) && (
18d30 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74  0 != (rc = sqlit
18d40 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
18d50 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 29 20 29  ger->fd, &n))) )
18d60 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  {.      pager_er
18d70 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
18d80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
18d90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18da0 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d  n>0 && n<pPager-
18db0 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
18dc0 20 20 20 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20     nPage = 1;.  
18dd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
18de0 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 6e 20  Page = (Pgno)(n 
18df0 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  / pPager->pageSi
18e00 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ze);.    }.    i
18e10 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
18e20 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
18e30 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
18e40 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
18e50 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
18e60 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65  FileSize = nPage
18e70 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
18e80 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 31 3b  dbSizeValid = 1;
18e90 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
18ea0 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
18eb0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
18ec0 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 67  in the file is g
18ed0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
18ee0 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64  .  ** configured
18ef0 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e   maximum pager n
18f00 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20  umber, increase 
18f10 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69  the allowed limi
18f20 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74  t so.  ** that t
18f30 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72  he file can be r
18f40 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ead..  */.  if( 
18f50 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78  nPage>pPager->mx
18f60 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  Pgno ){.    pPag
18f70 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67  er->mxPgno = (Pg
18f80 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20  no)nPage;.  }.. 
18f90 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70   /* Set the outp
18fa0 75 74 20 76 61 72 69 61 62 6c 65 20 61 6e 64 20  ut variable and 
18fb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18fc0 20 2a 2f 0a 20 20 69 66 28 20 70 6e 50 61 67 65   */.  if( pnPage
18fd0 20 29 7b 0a 20 20 20 20 2a 70 6e 50 61 67 65 20   ){.    *pnPage 
18fe0 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20 20 72  = nPage;.  }.  r
18ff0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19000 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  .}.../*.** Try t
19010 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  o obtain a lock 
19020 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65  of type locktype
19030 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
19040 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73   file. If.** a s
19050 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65  imilar or greate
19060 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  r lock is alread
19070 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e  y held, this fun
19080 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
19090 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53  .** (returning S
190a0 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61  QLITE_OK immedia
190b0 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  tely)..**.** Oth
190c0 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20  erwise, attempt 
190d0 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  to obtain the lo
190e0 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ck using sqlite3
190f0 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65  OsLock(). Invoke
19100 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61   .** the busy ca
19110 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f  llback if the lo
19120 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ck is currently 
19130 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52  not available. R
19140 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20  epeat .** until 
19150 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
19160 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20  k returns false 
19170 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74  or until the att
19180 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61  empt to .** obta
19190 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63  in the lock succ
191a0 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  eeds..**.** Retu
191b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
191c0 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65  success and an e
191d0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
191e0 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a  cannot obtain.**
191f0 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68   the lock. If th
19200 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  e lock is obtain
19210 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ed successfully,
19220 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 73   set the Pager.s
19230 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c  tate .** variabl
19240 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65  e to locktype be
19250 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
19260 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
19270 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
19280 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
19290 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
192a0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
192b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192c0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
192d0 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
192e0 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73  e OS lock values
192f0 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
19300 65 20 61 73 20 74 68 65 20 50 61 67 65 72 20 6c  e as the Pager l
19310 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  ock values */.  
19320 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 53 48  assert( PAGER_SH
19330 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  ARED==SHARED_LOC
19340 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  K );.  assert( P
19350 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52  AGER_RESERVED==R
19360 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a  ESERVED_LOCK );.
19370 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
19380 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55  EXCLUSIVE==EXCLU
19390 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  SIVE_LOCK );..  
193a0 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  /* If the file i
193b0 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f  s currently unlo
193c0 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73 69  cked then the si
193d0 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f  ze must be unkno
193e0 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  wn */.  assert( 
193f0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
19400 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70  AGER_SHARED || p
19410 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
19420 69 64 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43  id==0 );..  /* C
19430 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 69  heck that this i
19440 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70  s either a no-op
19450 20 28 62 65 63 61 75 73 65 20 74 68 65 20 72 65   (because the re
19460 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20  quested lock is 
19470 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65  .  ** already he
19480 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ld, or one of th
19490 65 20 74 72 61 6e 73 69 73 74 69 6f 6e 73 20 74  e transistions t
194a0 68 61 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e  hat the busy-han
194b0 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65  dler.  ** may be
194c0 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c   invoked during,
194d0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
194e0 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a  e comment above.
194f0 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65    ** sqlite3Page
19500 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
19510 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
19520 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  ( (pPager->state
19530 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20  >=locktype).    
19540 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73     || (pPager->s
19550 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
19560 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK && locktype==
19570 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20  PAGER_SHARED).  
19580 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
19590 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  >state==PAGER_RE
195a0 53 45 52 56 45 44 20 26 26 20 6c 6f 63 6b 74 79  SERVED && lockty
195b0 70 65 3d 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  pe==PAGER_EXCLUS
195c0 49 56 45 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28  IVE).  );..  if(
195d0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
195e0 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
195f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19600 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20    }else{.    do 
19610 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
19620 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
19630 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29  r->fd, locktype)
19640 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63  ;.    }while( rc
19650 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
19660 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
19670 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42  ndler(pPager->pB
19680 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29  usyHandlerArg) )
19690 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
196a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
196b0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
196c0 20 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20   (u8)locktype;. 
196d0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c       IOTRACE(("L
196e0 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
196f0 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29  ager, locktype))
19700 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
19710 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19720 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e   Truncate the in
19730 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
19740 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e   file image to n
19750 50 61 67 65 20 70 61 67 65 73 2e 20 54 68 69 73  Page pages. This
19760 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f   .** function do
19770 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  es not actually 
19780 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
19790 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
197a0 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65  . It .** just se
197b0 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ts the internal 
197c0 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67  state of the pag
197d0 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61  er object so tha
197e0 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61  t the .** trunca
197f0 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e  tion will be don
19800 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  e when the curre
19810 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
19820 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a  s committed..*/.
19830 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
19840 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50  rTruncateImage(P
19850 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
19860 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73  no nPage){.  ass
19870 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
19880 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 61 73  izeValid );.  as
19890 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
198a0 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20  Size>=nPage );. 
198b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
198c0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
198d0 53 45 52 56 45 44 20 29 3b 0a 20 20 70 50 61 67  SERVED );.  pPag
198e0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
198f0 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  ge;.}../*.** Shu
19900 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63  tdown the page c
19910 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20  ache.  Free all 
19920 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65  memory and close
19930 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a   all files..**.*
19940 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
19950 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65  on was in progre
19960 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ss when this rou
19970 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
19980 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  that.** transact
19990 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
199a0 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e  ck.  All outstan
199b0 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
199c0 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e  nvalidated.** an
199d0 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69  d their memory i
199e0 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74  s freed.  Any at
199f0 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70  tempt to use a p
19a00 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  age associated.*
19a10 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  * with this page
19a20 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
19a30 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
19a40 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  ns will likely.*
19a50 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  * result in a co
19a60 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  redump..**.** Th
19a70 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
19a80 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20  ys succeeds. If 
19a90 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
19aa0 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d   active an attem
19ab0 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f  pt.** is made to
19ac0 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49   roll it back. I
19ad0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
19ae0 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
19af0 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20  lback .** a hot 
19b00 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c  journal may be l
19b10 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73  eft in the files
19b20 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72  ystem but no err
19b30 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  or is returned.*
19b40 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  * to the caller.
19b50 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
19b60 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20  agerClose(Pager 
19b70 2a 70 50 61 67 65 72 29 7b 0a 20 20 64 69 73 61  *pPager){.  disa
19b80 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
19b90 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c  _errors();.  sql
19ba0 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
19bb0 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 50 61 67 65  alloc();.  pPage
19bc0 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a  r->errCode = 0;.
19bd0 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
19be0 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70  iveMode = 0;.  p
19bf0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
19c00 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  r);.  if( MEMDB 
19c10 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c  ){.    pager_unl
19c20 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ock(pPager);.  }
19c30 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 74  else{.    /* Set
19c40 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 48 64   Pager.journalHd
19c50 72 20 74 6f 20 2d 31 20 66 6f 72 20 74 68 65 20  r to -1 for the 
19c60 62 65 6e 65 66 69 74 20 6f 66 20 74 68 65 20 70  benefit of the p
19c70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
19c80 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 68 69  .    ** call whi
19c90 63 68 20 6d 61 79 20 62 65 20 6d 61 64 65 20 66  ch may be made f
19ca0 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72  rom within pager
19cb0 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
19cc0 6b 28 29 2e 20 49 66 20 69 74 0a 20 20 20 20 2a  k(). If it.    *
19cd0 2a 20 69 73 20 6e 6f 74 20 2d 31 2c 20 74 68 65  * is not -1, the
19ce0 6e 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20 70  n the unsynced p
19cf0 6f 72 74 69 6f 6e 20 6f 66 20 61 6e 20 6f 70 65  ortion of an ope
19d00 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  n journal file m
19d10 61 79 0a 20 20 20 20 2a 2a 20 62 65 20 70 6c 61  ay.    ** be pla
19d20 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  yed back into th
19d30 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61  e database. If a
19d40 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
19d50 63 63 75 72 73 20 77 68 69 6c 65 0a 20 20 20 20  ccurs while.    
19d60 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65  ** this is happe
19d70 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61  ning, the databa
19d80 73 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f  se may become co
19d90 72 72 75 70 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  rrupt..    */.  
19da0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
19db0 6c 48 64 72 20 3d 20 2d 31 3b 0a 20 20 20 20 70  lHdr = -1;.    p
19dc0 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
19dd0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
19de0 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42   }.  sqlite3EndB
19df0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
19e00 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
19e10 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
19e20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43 4c   PAGERTRACE(("CL
19e30 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  OSE %d\n", PAGER
19e40 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
19e50 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  IOTRACE(("CLOSE 
19e60 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
19e70 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
19e80 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
19e90 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
19ea0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
19eb0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  e);.  sqlite3Pca
19ec0 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  cheClose(pPager-
19ed0 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64  >pPCache);..#ifd
19ee0 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
19ef0 44 45 43 0a 20 20 69 66 28 20 70 50 61 67 65 72  DEC.  if( pPager
19f00 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20 70  ->xCodecFree ) p
19f10 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65  Pager->xCodecFre
19f20 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63  e(pPager->pCodec
19f30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
19f40 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53  ert( !pPager->aS
19f50 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61  avepoint && !pPa
19f60 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
19f70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 73  );.  assert( !is
19f80 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
19f90 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61  ) && !isOpen(pPa
19fa0 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20  ger->sjfd) );.. 
19fb0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
19fc0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
19fd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
19fe0 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
19ff0 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
1a000 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
1a010 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
1a020 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65   number for page
1a030 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71   pPg..*/.Pgno sq
1a040 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
1a050 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70 50 67  mber(DbPage *pPg
1a060 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  ){.  return pPg-
1a070 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a  >pgno;.}.#endif.
1a080 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  ./*.** Increment
1a090 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
1a0a0 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50  ount for page pP
1a0b0 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  g..*/.void sqlit
1a0c0 65 33 50 61 67 65 72 52 65 66 28 44 62 50 61 67  e3PagerRef(DbPag
1a0d0 65 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74  e *pPg){.  sqlit
1a0e0 65 33 50 63 61 63 68 65 52 65 66 28 70 50 67 29  e3PcacheRef(pPg)
1a0f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
1a100 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20  the journal. In 
1a110 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b  other words, mak
1a120 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70  e sure all the p
1a130 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a  ages that have.*
1a140 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  * been written t
1a150 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  o the journal ha
1a160 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63  ve actually reac
1a170 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20  hed the surface 
1a180 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61  of the.** disk a
1a190 6e 64 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  nd can be restor
1a1a0 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  ed in the event 
1a1b0 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  of a hot-journal
1a1c0 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
1a1d0 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65   If the Pager.ne
1a1e0 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 6e  edSync flag is n
1a1f0 6f 74 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69  ot set, then thi
1a200 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 0a  s function is a.
1a210 2a 2a 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77  ** no-op. Otherw
1a220 69 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73  ise, the actions
1a230 20 72 65 71 75 69 72 65 64 20 64 65 70 65 6e 64   required depend
1a240 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   on the journal-
1a250 6d 6f 64 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20  mode.** and the 
1a260 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
1a270 69 73 74 69 63 73 20 6f 66 20 74 68 65 20 74 68  istics of the th
1a280 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61  e file-system, a
1a290 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
1a2a0 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72     * If the jour
1a2b0 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69  nal file is an i
1a2c0 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
1a2d0 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e   file, no action
1a2e0 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20   need.**     be 
1a2f0 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  taken..**.**   *
1a300 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1a310 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e  he device does n
1a320 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53  ot support the S
1a330 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65  AFE_APPEND prope
1a340 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e  rty,.**     then
1a350 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
1a360 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
1a370 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75  ntly written jou
1a380 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20  rnal header.**  
1a390 20 20 20 69 73 20 75 70 64 61 74 65 64 20 74 6f     is updated to
1a3a0 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d   contain the num
1a3b0 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72  ber of journal r
1a3c0 65 63 6f 72 64 73 20 74 68 61 74 20 68 61 76 65  ecords that have
1a3d0 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69  .**     been wri
1a3e0 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  tten following i
1a3f0 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  t. If the pager 
1a400 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  is operating in 
1a410 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20  full-sync.**    
1a420 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
1a430 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
1a440 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68  synced before th
1a450 69 73 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  is field is upda
1a460 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ted..**.**   * I
1a470 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65  f the device doe
1a480 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68  s not support th
1a490 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f  e SEQUENTIAL pro
1a4a0 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20  perty, then .** 
1a4b0 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65      journal file
1a4c0 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a   is synced..**.*
1a4d0 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d  * Or, in pseudo-
1a4e0 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  code:.**.**   if
1a4f0 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79  ( NOT <in-memory
1a500 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20   journal> ){.** 
1a510 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45      if( NOT SAFE
1a520 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20  _APPEND ){.**   
1a530 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79      if( <full-sy
1a540 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63  nc mode> ) xSync
1a550 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29  (<journal file>)
1a560 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61  ;.**       <upda
1a570 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a  te nRec field>.*
1a580 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20  *     } .**     
1a590 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49  if( NOT SEQUENTI
1a5a0 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72  AL ) xSync(<jour
1a5b0 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20  nal file>);.**  
1a5c0 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67   }.**.** The Pag
1a5d0 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
1a5e0 20 69 73 20 6e 65 76 65 72 20 62 65 20 73 65 74   is never be set
1a5f0 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
1a600 69 6c 65 73 2c 20 6f 72 20 61 6e 79 0a 2a 2a 20  iles, or any.** 
1a610 66 69 6c 65 20 6f 70 65 72 61 74 69 6e 67 20 69  file operating i
1a620 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 28  n no-sync mode (
1a630 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 73 65 74  Pager.noSync set
1a640 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 29 2e 0a 2a   to non-zero)..*
1a650 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
1a660 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ul, this routine
1a670 20 63 6c 65 61 72 73 20 74 68 65 20 50 47 48 44   clears the PGHD
1a680 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
1a690 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61   of every .** pa
1a6a0 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  ge currently hel
1a6b0 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f  d in memory befo
1a6c0 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  re returning SQL
1a6d0 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f  ITE_OK. If an IO
1a6e0 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63  .** error is enc
1a6f0 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74  ountered, then t
1a700 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
1a710 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
1a720 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73  the caller..*/.s
1a730 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
1a740 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
1a750 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
1a760 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  er->needSync ){.
1a770 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
1a780 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
1a790 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1a7a0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
1a7b0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
1a7c0 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
1a7d0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1a7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7f0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1a800 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  ode */.      con
1a810 73 74 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c  st int iDc = sql
1a820 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
1a830 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
1a840 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61  er->fd);.      a
1a850 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1a860 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20  ager->jfd) );.. 
1a870 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
1a880 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
1a890 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20  FE_APPEND) ){.  
1a8a0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c        /* This bl
1a8b0 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61  ock deals with a
1a8c0 6e 20 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65  n obscure proble
1a8d0 6d 2e 20 49 66 20 74 68 65 20 6c 61 73 74 20 63  m. If the last c
1a8e0 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20  onnection.      
1a8f0 20 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20    ** that wrote 
1a900 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
1a910 20 77 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69   was operating i
1a920 6e 20 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75  n persistent-jou
1a930 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
1a940 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a  mode, then the j
1a950 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
1a960 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63  at this point ac
1a970 74 75 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72  tually be larger
1a980 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e  .        ** than
1a990 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
1a9a0 66 20 62 79 74 65 73 2e 20 49 66 20 74 68 65 20  f bytes. If the 
1a9b0 6e 65 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68  next thing in th
1a9c0 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  e journal.      
1a9d0 20 20 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e    ** file happen
1a9e0 73 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61  s to be a journa
1a9f0 6c 2d 68 65 61 64 65 72 20 28 77 72 69 74 74 65  l-header (writte
1aa00 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  n as part of the
1aa10 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76  .        ** prev
1aa20 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ious connections
1aa30 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61   transaction), a
1aa40 6e 64 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f  nd a crash or po
1aa50 77 65 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20  wer-failure .   
1aa60 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61       ** occurs a
1aa70 66 74 65 72 20 6e 52 65 63 20 69 73 20 75 70 64  fter nRec is upd
1aa80 61 74 65 64 20 62 75 74 20 62 65 66 6f 72 65 20  ated but before 
1aa90 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
1aaa0 77 72 69 74 65 73 20 0a 20 20 20 20 20 20 20 20  writes .        
1aab0 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  ** anything else
1aac0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
1aad0 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73  file (or commits
1aae0 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20  /rolls back its 
1aaf0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  .        ** tran
1ab00 73 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53  saction), then S
1ab10 51 4c 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65  QLite may become
1ab20 20 63 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64   confused when d
1ab30 6f 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20  oing the .      
1ab40 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c    ** hot-journal
1ab50 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77   rollback follow
1ab60 69 6e 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74  ing recovery. It
1ab70 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61   may roll back a
1ab80 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ll.        ** of
1ab90 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
1aba0 73 20 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f  s data, then pro
1abb0 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20  ceed to rolling 
1abc0 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20  back the old,.  
1abd0 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d        ** out-of-
1abe0 64 61 74 65 20 64 61 74 61 20 74 68 61 74 20 66  date data that f
1abf0 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62  ollows it. Datab
1ac00 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
1ac10 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
1ac20 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72     ** To work ar
1ac30 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68  ound this, if th
1ac40 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
1ac50 6f 65 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f  oes appear to co
1ac60 6e 74 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ntain.        **
1ac70 20 61 20 76 61 6c 69 64 20 68 65 61 64 65 72 20   a valid header 
1ac80 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e  following Pager.
1ac90 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e  journalOff, then
1aca0 20 77 72 69 74 65 20 61 20 30 78 30 30 0a 20 20   write a 0x00.  
1acb0 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f        ** byte to
1acc0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74   the start of it
1acd0 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66   to prevent it f
1ace0 72 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e  rom being recogn
1acf0 69 7a 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ized..        **
1ad00 0a 20 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69  .        ** Vari
1ad10 61 62 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66  able iNextHdrOff
1ad20 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  set is set to th
1ad30 65 20 6f 66 66 73 65 74 20 61 74 20 77 68 69 63  e offset at whic
1ad40 68 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a  h this.        *
1ad50 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65  * problematic he
1ad60 61 64 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c  ader will occur,
1ad70 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 61   if it exists. a
1ad80 4d 61 67 69 63 20 69 73 20 75 73 65 64 20 0a 20  Magic is used . 
1ad90 20 20 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74         ** as a t
1ada0 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20  emporary buffer 
1adb0 74 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20 66  to inspect the f
1adc0 69 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62  irst couple of b
1add0 79 74 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20  ytes of.        
1ade0 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c  ** the potential
1adf0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
1ae00 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1ae10 20 20 20 20 69 36 34 20 69 4e 65 78 74 48 64 72      i64 iNextHdr
1ae20 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
1ae30 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 09 75  u8 aMagic[8];..u
1ae40 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  8 zHeader[sizeof
1ae50 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
1ae60 34 5d 3b 0a 0a 09 6d 65 6d 63 70 79 28 7a 48 65  4];...memcpy(zHe
1ae70 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  ader, aJournalMa
1ae80 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
1ae90 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 09 70 75  rnalMagic));..pu
1aea0 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
1aeb0 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
1aec0 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d  Magic)], pPager-
1aed0 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20  >nRec);..       
1aee0 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20   iNextHdrOffset 
1aef0 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
1af00 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
1af10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1af20 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
1af30 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69  fd, aMagic, 8, i
1af40 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a  NextHdrOffset);.
1af50 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1af60 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d  SQLITE_OK && 0==
1af70 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
1af80 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
1af90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
1afa0 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65  atic const u8 ze
1afb0 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20  robyte = 0;.    
1afc0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1afd0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
1afe0 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65  ->jfd, &zerobyte
1aff0 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66  , 1, iNextHdrOff
1b000 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  set);.        }.
1b010 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1b020 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
1b030 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
1b040 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
1b050 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1b060 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1b070 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
1b080 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f   nRec value into
1b090 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b0a0 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a  e header. If in.
1b0b0 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d          ** full-
1b0c0 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
1b0d0 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
1b0e0 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65  al first. This e
1b0f0 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20  nsures that.    
1b100 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20      ** all data 
1b110 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74  has really hit t
1b120 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e  he disk before n
1b130 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74  Rec is updated t
1b140 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a  o mark.        *
1b150 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64  * it as a candid
1b160 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b  ate for rollback
1b170 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
1b180 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
1b190 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20  not required if 
1b1a0 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d  the persistent m
1b1b0 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68  edia supports th
1b1c0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46  e.        ** SAF
1b1d0 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74  E_APPEND propert
1b1e0 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68  y. Because in th
1b1f0 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f  is case it is no
1b200 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20  t possible .    
1b210 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61      ** for garba
1b220 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70  ge data to be ap
1b230 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69  pended to the fi
1b240 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65  le, the nRec fie
1b250 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  ld.        ** is
1b260 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
1b270 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20  0xFFFFFFFF when 
1b280 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
1b290 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20  er is written.  
1b2a0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76        ** and nev
1b2b0 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  er needs to be u
1b2c0 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20  pdated..        
1b2d0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
1b2e0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
1b2f0 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  && 0==(iDc&SQLIT
1b300 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
1b310 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  AL) ){.         
1b320 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59   PAGERTRACE(("SY
1b330 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
1b340 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1b350 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ger)));.        
1b360 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
1b370 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
1b380 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ).          rc =
1b390 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
1b3a0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
1b3b0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
1b3c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1b3d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1b3e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1b3f0 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52    }.        IOTR
1b400 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
1b410 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  ld\n", pPager, p
1b420 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
1b430 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  r));.        rc 
1b440 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1b450 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
1b460 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
1b470 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64  er, sizeof(zHead
1b480 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  er), pPager->jou
1b490 72 6e 61 6c 48 64 72 0a 09 29 3b 0a 20 20 20 20  rnalHdr..);.    
1b4a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1b4b0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1b4c0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
1b4d0 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c   if( 0==(iDc&SQL
1b4e0 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
1b4f0 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  TIAL) ){.       
1b500 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59   PAGERTRACE(("SY
1b510 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
1b520 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1b530 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ger)));.        
1b540 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
1b550 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
1b560 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1b570 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
1b580 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
1b590 73 79 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20  sync_flags| .   
1b5a0 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
1b5b0 73 79 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49  sync_flags==SQLI
1b5c0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c  TE_SYNC_FULL?SQL
1b5d0 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
1b5e0 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  Y:0).        );.
1b5f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1b600 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1b610 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1b620 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
1b630 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61   journal file wa
1b640 73 20 6a 75 73 74 20 73 75 63 63 65 73 73 66 75  s just successfu
1b650 6c 6c 79 20 73 79 6e 63 65 64 2e 20 53 65 74 20  lly synced. Set 
1b660 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 0a  Pager.needSync .
1b670 20 20 20 20 2a 2a 20 74 6f 20 7a 65 72 6f 20 61      ** to zero a
1b680 6e 64 20 63 6c 65 61 72 20 74 68 65 20 50 47 48  nd clear the PGH
1b690 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
1b6a0 67 20 6f 6e 20 61 6c 6c 20 70 61 67 65 73 73 2e  g on all pagess.
1b6b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
1b6c0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
1b6d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
1b6e0 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31  urnalStarted = 1
1b6f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
1b700 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67  cheClearSyncFlag
1b710 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  s(pPager->pPCach
1b720 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  e);.  }..  retur
1b730 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1b740 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
1b750 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  nt is the first 
1b760 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  in a linked list
1b770 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20   of dirty pages 
1b780 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79 20  connected.** by 
1b790 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79  the PgHdr.pDirty
1b7a0 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73 20 66   pointer. This f
1b7b0 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20 65  unction writes e
1b7c0 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a  ach one of the.*
1b7d0 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  * in-memory page
1b7e0 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 74 6f  s in the list to
1b7f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b800 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74  le. The argument
1b810 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c   may.** be NULL,
1b820 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e   representing an
1b830 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e 20   empty list. In 
1b840 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20 66  this case this f
1b850 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20  unction is.** a 
1b860 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  no-op..**.** The
1b870 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f 6c 64   pager must hold
1b880 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45   at least a RESE
1b890 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74  RVED lock when t
1b8a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
1b8b0 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72  is called. Befor
1b8c0 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74 68 69  e writing anythi
1b8d0 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
1b8e0 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f  se file, this lo
1b8f0 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61 64 65  ck.** is upgrade
1b900 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56  d to an EXCLUSIV
1b910 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c  E lock. If the l
1b920 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62  ock cannot be ob
1b930 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49 54  tained,.** SQLIT
1b940 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
1b950 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61 20 69  ed and no data i
1b960 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
1b970 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1b980 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  ** .** If the pa
1b990 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d 66 69  ger is a temp-fi
1b9a0 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74 68 65  le pager and the
1b9b0 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73 79 73   actual file-sys
1b9c0 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20 6e  tem file.** is n
1b9d0 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69 74 20  ot yet open, it 
1b9e0 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6f  is created and o
1b9f0 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61 6e 79  pened before any
1ba00 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77 72 69   data is .** wri
1ba10 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20  tten out..**.** 
1ba20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20 68 61  Once the lock ha
1ba30 73 20 62 65 65 6e 20 75 70 67 72 61 64 65 64 20  s been upgraded 
1ba40 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72  and, if necessar
1ba50 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  y, the file open
1ba60 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 73  ed,.** the pages
1ba70 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 75 74   are written out
1ba80 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1ba90 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f 72   file in list or
1baa0 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a 20  der. Writing.** 
1bab0 61 20 70 61 67 65 20 69 73 20 73 6b 69 70 70 65  a page is skippe
1bac0 64 20 69 66 20 69 74 20 6d 65 65 74 73 20 65 69  d if it meets ei
1bad0 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ther of the foll
1bae0 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 3a 0a  owing criteria:.
1baf0 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61  **.**   * The pa
1bb00 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65  ge number is gre
1bb10 61 74 65 72 20 74 68 61 6e 20 50 61 67 65 72 2e  ater than Pager.
1bb20 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20  dbSize, or.**   
1bb30 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f 4e 54  * The PGHDR_DONT
1bb40 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73 20 73  _WRITE flag is s
1bb50 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  et on the page..
1bb60 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e 67  **.** If writing
1bb70 20 6f 75 74 20 61 20 70 61 67 65 20 63 61 75 73   out a page caus
1bb80 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  es the database 
1bb90 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50 61  file to grow, Pa
1bba0 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a 2a  ger.dbFileSize.*
1bbb0 2a 20 69 73 20 75 70 64 61 74 65 64 20 61 63 63  * is updated acc
1bbc0 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70 61 67  ordingly. If pag
1bbd0 65 20 31 20 69 73 20 77 72 69 74 74 65 6e 20 6f  e 1 is written o
1bbe0 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ut, then the val
1bbf0 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e 20  ue cached.** in 
1bc00 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
1bc10 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  [] is updated to
1bc20 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 76   match the new v
1bc30 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
1bc40 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
1bc50 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76  ile..**.** If ev
1bc60 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
1bc70 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
1bc80 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
1bc90 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a  f an IO error .*
1bca0 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20  * occurs, an IO 
1bcb0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1bcc0 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74  turned. Or, if t
1bcd0 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  he EXCLUSIVE loc
1bce0 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f  k cannot.** be o
1bcf0 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54 45 5f  btained, SQLITE_
1bd00 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
1bd10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1bd20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
1bd30 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73  list(PgHdr *pLis
1bd40 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  t){.  Pager *pPa
1bd50 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ger;            
1bd60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1bd70 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
1bd80 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1bd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bda0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1bdb0 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20 4e 45  ode */..  if( NE
1bdc0 56 45 52 28 70 4c 69 73 74 3d 3d 30 29 20 29 20  VER(pList==0) ) 
1bdd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1bde0 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69  ;.  pPager = pLi
1bdf0 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f  st->pPager;..  /
1be00 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
1be10 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 69 74  there may be eit
1be20 68 65 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  her a RESERVED o
1be30 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
1be40 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
1be50 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
1be60 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
1be70 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
1be80 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  k, the following
1be90 0a 20 20 2a 2a 20 63 61 6c 6c 20 69 73 20 61 20  .  ** call is a 
1bea0 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  no-op..  **.  **
1beb0 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b   Moving the lock
1bec0 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74   from RESERVED t
1bed0 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63 74 75  o EXCLUSIVE actu
1bee0 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f  ally involves go
1bef0 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68  ing.  ** through
1bf00 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65   an intermediate
1bf10 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20   state PENDING. 
1bf20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b    A PENDING lock
1bf30 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20   prevents new.  
1bf40 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20  ** readers from 
1bf50 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65  attaching to the
1bf60 20 64 61 74 61 62 61 73 65 20 62 75 74 20 69 73   database but is
1bf70 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f   unsufficient fo
1bf80 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69  r us to.  ** wri
1bf90 74 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66  te.  The idea of
1bfa0 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
1bfb0 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65  is to prevent ne
1bfc0 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20  w readers from. 
1bfd0 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68   ** coming in wh
1bfe0 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72 20  ile we wait for 
1bff0 65 78 69 73 74 69 6e 67 20 72 65 61 64 65 72 73  existing readers
1c000 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a   to clear..  **.
1c010 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70    ** While the p
1c020 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 52  ager is in the R
1c030 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
1c040 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
1c050 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69  base file.  ** i
1c060 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  s unchanged and 
1c070 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20  we can rollback 
1c080 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
1c090 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20  o playback the. 
1c0a0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f   ** journal into
1c0b0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
1c0c0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e  tabase file.  On
1c0d0 63 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e  ce we transition
1c0e0 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49   to.  ** EXCLUSI
1c0f0 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  VE, it means the
1c100 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
1c110 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20  as been changed 
1c120 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b  and any rollback
1c130 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69  .  ** will requi
1c140 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61  re a journal pla
1c150 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73  yback..  */.  as
1c160 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1c170 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
1c180 56 45 44 20 29 3b 0a 20 20 72 63 20 3d 20 70 61  VED );.  rc = pa
1c190 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
1c1a0 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
1c1b0 56 45 5f 4c 4f 43 4b 29 3b 0a 0a 20 20 2f 2a 20  VE_LOCK);..  /* 
1c1c0 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 61  If the file is a
1c1d0 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e   temp-file has n
1c1e0 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e  ot yet been open
1c1f0 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  ed, open it now.
1c200 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20   It.  ** is not 
1c210 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20  possible for rc 
1c220 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e  to be other than
1c230 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
1c240 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69  is branch.  ** i
1c250 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65  s taken, as page
1c260 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29  r_wait_on_lock()
1c270 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
1c280 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f  temp-files..  */
1c290 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
1c2a0 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
1c2b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1c2c0 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63  ->tempFile && rc
1c2d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
1c2e0 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65     rc = pagerOpe
1c2f0 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50  ntemp(pPager, pP
1c300 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
1c310 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d  ->vfsFlags);.  }
1c320 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ..  while( rc==S
1c330 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73  QLITE_OK && pLis
1c340 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  t ){.    Pgno pg
1c350 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  no = pList->pgno
1c360 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
1c370 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67  re are dirty pag
1c380 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  es in the page c
1c390 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e  ache with page n
1c3a0 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20  umbers greater. 
1c3b0 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
1c3c0 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65  .dbSize, this me
1c3d0 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ans sqlite3Pager
1c3e0 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20  TruncateImage() 
1c3f0 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20  was called to.  
1c400 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69    ** make the fi
1c410 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73  le smaller (pres
1c420 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76  umably by auto-v
1c430 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20  acuum code). Do 
1c440 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a  not write.    **
1c450 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20   any such pages 
1c460 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  to the file..   
1c470 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c   **.    ** Also,
1c480 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75   do not write ou
1c490 74 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20  t any page that 
1c4a0 68 61 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f  has the PGHDR_DO
1c4b0 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20  NT_WRITE flag.  
1c4c0 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79    ** set (set by
1c4d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1c4e0 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a  tWrite())..    *
1c4f0 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d  /.    if( pgno<=
1c500 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26  pPager->dbSize &
1c510 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61  & 0==(pList->fla
1c520 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  gs&PGHDR_DONT_WR
1c530 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36  ITE) ){.      i6
1c540 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f  4 offset = (pgno
1c550 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
1c560 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20  >pageSize;   /* 
1c570 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20  Offset to write 
1c580 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  */.      char *p
1c590 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
1c5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5b0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
1c5c0 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a  to write */    .
1c5d0 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65  .      /* Encode
1c5e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
1c5f0 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50  .      CODEC2(pP
1c600 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61  ager, pList->pDa
1c610 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74  ta, pgno, 6, ret
1c620 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1c630 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  , pData);..     
1c640 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68   /* Write out th
1c650 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a  e page data. */.
1c660 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1c670 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
1c680 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61  ->fd, pData, pPa
1c690 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
1c6a0 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f  ffset);..      /
1c6b0 2a 20 49 66 20 70 61 67 65 20 31 20 77 61 73 20  * If page 1 was 
1c6c0 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70  just written, up
1c6d0 64 61 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c  date Pager.dbFil
1c6e0 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20  eVers to match. 
1c6f0 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75       ** the valu
1c700 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20  e now stored in 
1c710 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c720 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74 68  e. If writing th
1c730 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  is .      ** pag
1c740 65 20 63 61 75 73 65 64 20 74 68 65 20 64 61 74  e caused the dat
1c750 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
1c760 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c  ow, update dbFil
1c770 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f  eSize. .      */
1c780 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  .      if( pgno=
1c790 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =1 ){.        me
1c7a0 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
1c7b0 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61  FileVers, &pData
1c7c0 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61  [24], sizeof(pPa
1c7d0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
1c7e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1c7f0 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
1c800 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a  ->dbFileSize ){.
1c810 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1c820 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e  dbFileSize = pgn
1c830 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  o;.      }..    
1c840 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20    /* Update any 
1c850 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63  backup objects c
1c860 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  opying the conte
1c870 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  nts of this page
1c880 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  r. */.      sqli
1c890 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
1c8a0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
1c8b0 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73   pgno, (u8*)pLis
1c8c0 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20  t->pData);..    
1c8d0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
1c8e0 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20  TORE %d page %d 
1c8f0 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
1c900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c910 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1c920 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
1c930 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29  agehash(pList)))
1c940 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
1c950 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22  ("PGOUT %p %d\n"
1c960 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
1c970 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
1c980 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
1c990 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b  _writedb_count);
1c9a0 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
1c9b0 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  R(pPager->nWrite
1c9c0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1c9d0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
1c9e0 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65  "NOSTORE %d page
1c9f0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1ca00 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b  pPager), pgno));
1ca10 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
1ca20 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
1ca30 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65  .    pList->page
1ca40 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
1ca50 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65  ehash(pList);.#e
1ca60 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d  ndif.    pList =
1ca70 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
1ca80 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1ca90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
1caa0 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68  d a record of th
1cab0 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
1cac0 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f 20 74  of page pPg to t
1cad0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
1cae0 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 63 61  .** It is the ca
1caf0 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69  llers responsibi
1cb00 6c 69 74 79 20 74 6f 20 75 73 65 20 73 75 62 6a  lity to use subj
1cb10 52 65 71 75 69 72 65 73 50 61 67 65 28 29 20 74  RequiresPage() t
1cb20 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74  o check .** that
1cb30 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65   it is really re
1cb40 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 63 61  quired before ca
1cb50 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1cb60 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ion..**.** If su
1cb70 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
1cb80 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
1cb90 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f  ing to pPg->pgno
1cba0 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a   in the bitvecs.
1cbb0 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20  ** for all open 
1cbc0 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72  savepoints befor
1cbd0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
1cbe0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1cbf0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1cc00 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
1cc10 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
1cc20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63  an IO.** error c
1cc30 6f 64 65 20 69 66 20 74 68 65 20 61 74 74 65 6d  ode if the attem
1cc40 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  pt to write to t
1cc50 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
1cc60 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c  ails, or .** SQL
1cc70 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
1cc80 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c  alloc fails whil
1cc90 65 20 73 65 74 74 69 6e 67 20 61 20 62 69 74 20  e setting a bit 
1cca0 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a  in a savepoint.*
1ccb0 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61  * bitvec..*/.sta
1ccc0 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e  tic int subjourn
1ccd0 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  alPage(PgHdr *pP
1cce0 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
1ccf0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1cd00 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1cd10 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 69  >pPager;.  if( i
1cd20 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
1cd30 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  fd) ){.    void 
1cd40 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44  *pData = pPg->pD
1cd50 61 74 61 3b 0a 20 20 20 20 69 36 34 20 6f 66 66  ata;.    i64 off
1cd60 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53  set = pPager->nS
1cd70 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
1cd80 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1cd90 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20  char *pData2;.. 
1cda0 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
1cdb0 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
1cdc0 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51  no, 7, return SQ
1cdd0 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74  LITE_NOMEM, pDat
1cde0 61 32 29 3b 0a 20 20 20 20 50 41 47 45 52 54 52  a2);.    PAGERTR
1cdf0 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e  ACE(("STMT-JOURN
1ce00 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
1ce10 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1ce20 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  ), pPg->pgno));.
1ce30 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70    .    assert( p
1ce40 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67  ageInJournal(pPg
1ce50 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70  ) || pPg->pgno>p
1ce60 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
1ce70 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 72  e );.    rc = wr
1ce80 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
1ce90 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20  ->sjfd, offset, 
1cea0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1ceb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cec0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1ced0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
1cee0 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61  Pager->sjfd, pDa
1cef0 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
1cf00 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29  eSize, offset+4)
1cf10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1cf20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1cf30 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
1cf40 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73  SubRec++;.    as
1cf50 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53  sert( pPager->nS
1cf60 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20  avepoint>0 );.  
1cf70 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65    rc = addToSave
1cf80 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
1cf90 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
1cfa0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1cfb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1cfc0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1cfd0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
1cfe0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1cff0 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65  ed by the pcache
1d000 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68   layer when it h
1d010 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a  as reached some.
1d020 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c  ** soft memory l
1d030 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74 20  imit. The first 
1d040 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
1d050 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
1d060 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74   object.** (cast
1d070 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68   as a void*). Th
1d080 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61 79  e pager is alway
1d090 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e  s 'purgeable' (n
1d0a0 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  ot an in-memory.
1d0b0 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54 68  ** database). Th
1d0c0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1d0d0 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  t is a reference
1d0e0 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74 20   to a page that 
1d0f0 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  is .** currently
1d100 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20 6e   dirty but has n
1d110 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
1d120 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61  ferences. The pa
1d130 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20  ge.** is always 
1d140 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1d150 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
1d160 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
1d170 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  irst .** argumen
1d180 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62  t..**.** The job
1d190 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
1d1a0 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67  n is to make pPg
1d1b0 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e   clean by writin
1d1c0 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a  g its contents.*
1d1d0 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  * out to the dat
1d1e0 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70  abase file, if p
1d1f0 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61  ossible. This ma
1d200 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e  y involve syncin
1d210 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  g the.** journal
1d220 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   file. .**.** If
1d230 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c   successful, sql
1d240 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
1d250 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ean() is called 
1d260 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a  on the page and.
1d270 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
1d280 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
1d290 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
1d2a0 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b  le trying to mak
1d2b0 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c  e the.** page cl
1d2c0 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  ean, the IO erro
1d2d0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1d2e0 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ed. If the page 
1d2f0 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64  cannot be.** mad
1d300 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65  e clean for some
1d310 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62   other reason, b
1d320 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
1d330 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  rs, then SQLITE_
1d340 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
1d350 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63  d by sqlite3Pcac
1d360 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73  heMakeClean() is
1d370 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a   not called..*/.
1d380 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1d390 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20  Stress(void *p, 
1d3a0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
1d3b0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28  ager *pPager = (
1d3c0 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74  Pager *)p;.  int
1d3d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d3e0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ..  assert( pPg-
1d3f0 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
1d400 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
1d410 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
1d420 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  RTY );..  /* The
1d430 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20   doNotSync flag 
1d440 69 73 20 73 65 74 20 62 79 20 74 68 65 20 73 71  is set by the sq
1d450 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1d460 29 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65  ) function while
1d470 20 69 74 0a 20 20 2a 2a 20 69 73 20 6a 6f 75 72   it.  ** is jour
1d480 6e 61 6c 6c 69 6e 67 20 61 20 73 65 74 20 6f 66  nalling a set of
1d490 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 64 61 74   two or more dat
1d4a0 61 62 61 73 65 20 70 61 67 65 73 20 74 68 61 74  abase pages that
1d4b0 20 61 72 65 20 73 74 6f 72 65 64 0a 20 20 2a 2a   are stored.  **
1d4c0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 64 69 73   on the same dis
1d4d0 6b 20 73 65 63 74 6f 72 2e 20 53 79 6e 63 69 6e  k sector. Syncin
1d4e0 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  g the journal is
1d4f0 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 77 68 69   not allowed whi
1d500 6c 65 0a 20 20 2a 2a 20 74 68 69 73 20 69 73 20  le.  ** this is 
1d510 68 61 70 70 65 6e 69 6e 67 20 61 73 20 69 74 20  happening as it 
1d520 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  is important tha
1d530 74 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66  t all members of
1d540 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 65 74   such a.  ** set
1d550 20 6f 66 20 70 61 67 65 73 20 61 72 65 20 73 79   of pages are sy
1d560 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 74 6f 67  nced to disk tog
1d570 65 74 68 65 72 2e 20 53 6f 2c 20 69 66 20 74 68  ether. So, if th
1d580 65 20 70 61 67 65 20 74 68 69 73 20 66 75 6e 63  e page this func
1d590 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 72 79  tion.  ** is try
1d5a0 69 6e 67 20 74 6f 20 6d 61 6b 65 20 63 6c 65 61  ing to make clea
1d5b0 6e 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61  n will require a
1d5c0 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 61 6e   journal sync an
1d5d0 64 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 0a  d the doNotSync.
1d5e0 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74    ** flag is set
1d5f0 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  , return without
1d600 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e   doing anything.
1d610 20 54 68 65 20 70 63 61 63 68 65 20 6c 61 79 65   The pcache laye
1d620 72 20 77 69 6c 6c 0a 20 20 2a 2a 20 6a 75 73 74  r will.  ** just
1d630 20 68 61 76 65 20 74 6f 20 67 6f 20 61 68 65 61   have to go ahea
1d640 64 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 61  d and allocate a
1d650 20 6e 65 77 20 70 61 67 65 20 62 75 66 66 65 72   new page buffer
1d660 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 2a 2a   instead of.  **
1d670 20 72 65 75 73 69 6e 67 20 70 50 67 2e 0a 20 20   reusing pPg..  
1d680 2a 2a 0a 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c  **.  ** Similarl
1d690 79 2c 20 69 66 20 74 68 65 20 70 61 67 65 72 20  y, if the pager 
1d6a0 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65  has already ente
1d6b0 72 65 64 20 74 68 65 20 65 72 72 6f 72 20 73 74  red the error st
1d6c0 61 74 65 2c 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a  ate, do not.  **
1d6d0 20 74 72 79 20 74 6f 20 77 72 69 74 65 20 74 68   try to write th
1d6e0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50  e contents of pP
1d6f0 67 20 74 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  g to disk..  */.
1d700 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
1d710 72 43 6f 64 65 20 7c 7c 20 28 70 50 61 67 65 72  rCode || (pPager
1d720 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 26 26 20 70  ->doNotSync && p
1d730 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
1d740 4e 45 45 44 5f 53 59 4e 43 29 20 29 7b 0a 20 20  NEED_SYNC) ){.  
1d750 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d760 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 79  OK;.  }..  /* Sy
1d770 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
1d780 69 6c 65 20 69 66 20 72 65 71 75 69 72 65 64 2e  ile if required.
1d790 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 66   */.  if( pPg->f
1d7a0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
1d7b0 53 59 4e 43 20 29 7b 0a 20 20 20 20 72 63 20 3d  SYNC ){.    rc =
1d7c0 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
1d7d0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
1d7e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1d7f0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
1d800 26 26 20 0a 20 20 20 20 20 20 21 28 70 50 61 67  && .      !(pPag
1d810 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
1d820 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
1d830 44 45 5f 4d 45 4d 4f 52 59 29 20 26 26 0a 20 20  DE_MEMORY) &&.  
1d840 20 20 20 20 21 28 73 71 6c 69 74 65 33 4f 73 44      !(sqlite3OsD
1d850 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1d860 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
1d870 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
1d880 46 45 5f 41 50 50 45 4e 44 29 0a 20 20 20 20 29  FE_APPEND).    )
1d890 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
1d8a0 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRec = 0;.      
1d8b0 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
1d8c0 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
1d8d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
1d8e0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1d8f0 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 69 73   of this page is
1d900 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
1d910 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
1d920 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61  .  ** the databa
1d930 73 65 20 69 6d 61 67 65 2c 20 69 74 20 6d 61 79  se image, it may
1d940 20 6e 65 65 64 20 74 6f 20 62 65 20 77 72 69 74   need to be writ
1d950 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  ten to the sub-j
1d960 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 20 54 68 69  ournal..  ** Thi
1d970 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65  s is because the
1d980 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77   call to pager_w
1d990 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29 20  rite_pagelist() 
1d9a0 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20  below will not. 
1d9b0 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72 69   ** actually wri
1d9c0 74 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 66  te data to the f
1d9d0 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ile in this case
1d9e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 73  ..  **.  ** Cons
1d9f0 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
1da00 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20 65  ng sequence of e
1da10 76 65 6e 74 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  vents:.  **.  **
1da20 20 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20     BEGIN;.  **  
1da30 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65     <journal page
1da40 20 58 3e 0a 20 20 2a 2a 20 20 20 20 20 3c 6d 6f   X>.  **     <mo
1da50 64 69 66 79 20 70 61 67 65 20 58 3e 0a 20 20 2a  dify page X>.  *
1da60 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20  *     SAVEPOINT 
1da70 73 70 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c  sp;.  **       <
1da80 73 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65 20  shrink database 
1da90 66 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73 3e  file to Y pages>
1daa0 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67 65  .  **       page
1dab0 72 53 74 72 65 73 73 28 70 61 67 65 20 58 29 0a  rStress(page X).
1dac0 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43    **     ROLLBAC
1dad0 4b 20 54 4f 20 73 70 3b 0a 20 20 2a 2a 0a 20 20  K TO sp;.  **.  
1dae0 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68 65  ** If (X>Y), the
1daf0 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74 72 65  n when pagerStre
1db00 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61 67  ss is called pag
1db10 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  e X will not be 
1db20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 6f 75 74  written.  ** out
1db30 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1db40 20 66 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20   file, but will 
1db50 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20  be dropped from 
1db60 74 68 65 20 63 61 63 68 65 2e 20 54 68 65 6e 2c  the cache. Then,
1db70 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  .  ** following 
1db80 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  the "ROLLBACK TO
1db90 20 73 70 22 20 73 74 61 74 65 6d 65 6e 74 2c 20   sp" statement, 
1dba0 72 65 61 64 69 6e 67 20 70 61 67 65 20 58 20 77  reading page X w
1dbb0 69 6c 6c 20 72 65 61 64 0a 20 20 2a 2a 20 64 61  ill read.  ** da
1dbc0 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ta from the data
1dbd0 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20  base file. This 
1dbe0 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70 79  will be the copy
1dbf0 20 6f 66 20 70 61 67 65 20 58 20 61 73 20 69 74   of page X as it
1dc00 0a 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20 74  .  ** was when t
1dc10 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
1dc20 74 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20 69  tarted, not as i
1dc30 74 20 77 61 73 20 77 68 65 6e 20 22 53 41 56 45  t was when "SAVE
1dc40 50 4f 49 4e 54 20 73 70 22 0a 20 20 2a 2a 20 77  POINT sp".  ** w
1dc50 61 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a  as executed..  *
1dc60 2a 0a 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74  *.  ** The solut
1dc70 69 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20  ion is to write 
1dc80 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
1dc90 20 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f   for page X into
1dca0 20 74 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a   the .  ** sub-j
1dcb0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20  ournal file now 
1dcc0 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
1dcd0 72 65 61 64 79 20 74 68 65 72 65 29 2c 20 73 6f  ready there), so
1dce0 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20 20   that it will.  
1dcf0 2a 2a 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  ** be restored t
1dd00 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61  o its current va
1dd10 6c 75 65 20 77 68 65 6e 20 74 68 65 20 22 52 4f  lue when the "RO
1dd20 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 69 73  LLBACK TO sp" is
1dd30 20 0a 20 20 2a 2a 20 65 78 65 63 75 74 65 64 2e   .  ** executed.
1dd40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
1dd50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 67  SQLITE_OK && pPg
1dd60 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ->pgno>pPager->d
1dd70 62 53 69 7a 65 20 26 26 20 73 75 62 6a 52 65 71  bSize && subjReq
1dd80 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29  uiresPage(pPg) )
1dd90 7b 0a 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f  {.    rc = subjo
1dda0 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a  urnalPage(pPg);.
1ddb0 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20    }..  /* Write 
1ddc0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1ddd0 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20  the page out to 
1dde0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ddf0 65 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  e. */.  if( rc==
1de00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1de10 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30   pPg->pDirty = 0
1de20 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1de30 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
1de40 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  pPg);.  }..  /* 
1de50 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
1de60 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28   clean. */.  if(
1de70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1de80 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  {.    PAGERTRACE
1de90 28 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67  (("STRESS %d pag
1dea0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
1deb0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1dec0 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  gno));.    sqlit
1ded0 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
1dee0 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72  n(pPg);.  }..  r
1def0 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
1df00 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d  r(pPager, rc);.}
1df10 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  .../*.** Allocat
1df20 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
1df30 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a   a new Pager obj
1df40 65 63 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f  ect and put a po
1df50 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69  inter to it.** i
1df60 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20  n *ppPager. The 
1df70 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65  pager should eve
1df80 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64  ntually be freed
1df90 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a   by passing it.*
1dfa0 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  * to sqlite3Page
1dfb0 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  rClose()..**.** 
1dfc0 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72  The zFilename ar
1dfd0 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61  gument is the pa
1dfe0 74 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  th to the databa
1dff0 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e  se file to open.
1e000 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
1e010 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20   is NULL then a 
1e020 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74  randomly-named t
1e030 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
1e040 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
1e050 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65  used as the file
1e060 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54   to be cached. T
1e070 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61  emporary files a
1e080 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a  re be deleted.**
1e090 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77   automatically w
1e0a0 68 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f  hen they are clo
1e0b0 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d  sed. If zFilenam
1e0c0 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
1e0d0 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66  then .** all inf
1e0e0 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64  ormation is held
1e0f0 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73   in cache. It is
1e100 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74   never written t
1e110 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73  o disk. .** This
1e120 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
1e130 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d  implement an in-
1e140 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
1e150 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72  .**.** The nExtr
1e160 61 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63  a parameter spec
1e170 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72  ifies the number
1e180 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
1e190 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  ce allocated.** 
1e1a0 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20  along with each 
1e1b0 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
1e1c0 54 68 69 73 20 73 70 61 63 65 20 69 73 20 61 76  This space is av
1e1d0 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75  ailable to the u
1e1e0 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73  ser.** via the s
1e1f0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
1e200 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a  tra() API..**.**
1e210 20 54 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d   The flags argum
1e220 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 73  ent is used to s
1e230 70 65 63 69 66 79 20 70 72 6f 70 65 72 74 69 65  pecify propertie
1e240 73 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68  s that affect th
1e250 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f  e.** operation o
1e260 66 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20  f the pager. It 
1e270 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64  should be passed
1e280 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f   some bitwise co
1e290 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  mbination.** of 
1e2a0 74 68 65 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a  the PAGER_OMIT_J
1e2b0 4f 55 52 4e 41 4c 20 61 6e 64 20 50 41 47 45 52  OURNAL and PAGER
1e2c0 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66 6c 61  _NO_READLOCK fla
1e2d0 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66  gs..**.** The vf
1e2e0 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72  sFlags parameter
1e2f0 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f   is a bitmask to
1e300 20 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61   pass to the fla
1e310 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  gs parameter.** 
1e320 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d  of the xOpen() m
1e330 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70  ethod of the sup
1e340 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f  plied VFS when o
1e350 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a  pening files. .*
1e360 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
1e370 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f  r object is allo
1e380 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 73 70  cated and the sp
1e390 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65  ecified file ope
1e3a0 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66  ned .** successf
1e3b0 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ully, SQLITE_OK 
1e3c0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1e3d0 2a 70 70 50 61 67 65 72 20 73 65 74 20 74 6f 20  *ppPager set to 
1e3e0 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  point to.** the 
1e3f0 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74  new pager object
1e400 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
1e410 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69  curs, *ppPager i
1e420 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a  s set to NULL.**
1e430 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20   and error code 
1e440 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66  returned. This f
1e450 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75  unction may retu
1e460 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  rn SQLITE_NOMEM.
1e470 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  ** (sqlite3Mallo
1e480 63 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61  c() is used to a
1e490 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c  llocate memory),
1e4a0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
1e4b0 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20   or .** various 
1e4c0 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72  SQLITE_IO_XXX er
1e4d0 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rors..*/.int sql
1e4e0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20  ite3PagerOpen(. 
1e4f0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1e500 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  fs,       /* The
1e510 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79   virtual file sy
1e520 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20  stem to use */. 
1e530 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
1e540 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ,         /* OUT
1e550 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67  : Return the Pag
1e560 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72  er structure her
1e570 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
1e580 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
1e590 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
1e5a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
1e5b0 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  open */.  int nE
1e5c0 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20  xtra,           
1e5d0 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65     /* Extra byte
1e5e0 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68  s append to each
1e5f0 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
1e600 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
1e610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e620 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69   flags controlli
1e630 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  ng this file */.
1e640 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20    int vfsFlags, 
1e650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
1e660 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
1e670 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66  gh to sqlite3_vf
1e680 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76  s.xOpen() */.  v
1e690 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44  oid (*xReinit)(D
1e6a0 62 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74  bPage*) /* Funct
1e6b0 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c  ion to reinitial
1e6c0 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a  ize pages */.){.
1e6d0 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61    u8 *pPtr;.  Pa
1e6e0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b  ger *pPager = 0;
1e6f0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
1e700 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61  object to alloca
1e710 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f  te and return */
1e720 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1e730 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52  TE_OK;      /* R
1e740 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1e750 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30  int tempFile = 0
1e760 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
1e770 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20   for temp files 
1e780 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79  (incl. in-memory
1e790 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74   files) */.  int
1e7a0 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20   memDb = 0;     
1e7b0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1e7c0 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
1e7d0 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
1e7e0 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30  int readOnly = 0
1e7f0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
1e800 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65   if this is a re
1e810 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a  ad-only file */.
1e820 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c    int journalFil
1e830 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79  eSize;     /* By
1e840 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
1e850 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c  for each journal
1e860 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   fd */.  char *z
1e870 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20  Pathname = 0;   
1e880 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74    /* Full path t
1e890 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  o database file 
1e8a0 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61  */.  int nPathna
1e8b0 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  me = 0;       /*
1e8c0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1e8d0 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f   in zPathname */
1e8e0 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61  .  int useJourna
1e8f0 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  l = (flags & PAG
1e900 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29  ER_OMIT_JOURNAL)
1e910 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f  ==0; /* False to
1e920 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f   omit journal */
1e930 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63  .  int noReadloc
1e940 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  k = (flags & PAG
1e950 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21  ER_NO_READLOCK)!
1e960 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =0;  /* True to 
1e970 6f 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b 20 2a  omit read-lock *
1e980 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53 69  /.  int pcacheSi
1e990 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  ze = sqlite3Pcac
1e9a0 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20  heSize();       
1e9b0 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f  /* Bytes to allo
1e9c0 63 61 74 65 20 66 6f 72 20 50 43 61 63 68 65 20  cate for PCache 
1e9d0 2a 2f 0a 20 20 75 31 36 20 73 7a 50 61 67 65 44  */.  u16 szPageD
1e9e0 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  flt = SQLITE_DEF
1e9f0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20  AULT_PAGE_SIZE; 
1ea00 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65   /* Default page
1ea10 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 2f 2a 20 46   size */..  /* F
1ea20 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75  igure out how mu
1ea30 63 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75  ch space is requ
1ea40 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f  ired for each jo
1ea50 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c  urnal file-handl
1ea60 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72  e.  ** (there ar
1ea70 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74  e two of them, t
1ea80 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
1ea90 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  and the sub-jour
1eaa0 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20  nal). This.  ** 
1eab0 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73  is the maximum s
1eac0 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
1ead0 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  r an in-memory j
1eae0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
1eaf0 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72  le .  ** and a r
1eb00 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66  egular journal f
1eb10 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65  ile-handle. Note
1eb20 20 74 68 61 74 20 61 20 22 72 65 67 75 6c 61 72   that a "regular
1eb30 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22   journal-handle"
1eb40 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77  .  ** may be a w
1eb50 72 61 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f  rapper capable o
1eb60 66 20 63 61 63 68 69 6e 67 20 74 68 65 20 66 69  f caching the fi
1eb70 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  rst portion of t
1eb80 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
1eb90 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74  file in memory t
1eba0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
1ebb0 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
1ebc0 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a  imization (see .
1ebd0 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65    ** source file
1ebe0 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a   journal.c)..  *
1ebf0 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a  /.  if( sqlite3J
1ec00 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
1ec10 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e  >sqlite3MemJourn
1ec20 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20  alSize() ){.    
1ec30 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
1ec40 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
1ec50 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
1ec60 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
1ec70 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
1ec80 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65   = ROUND8(sqlite
1ec90 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  3MemJournalSize(
1eca0 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ));.  }..  /* Se
1ecb0 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  t the output var
1ecc0 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e  iable to NULL in
1ecd0 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f   case an error o
1ece0 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50  ccurs. */.  *ppP
1ecf0 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  ager = 0;..  /* 
1ed00 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72  Compute and stor
1ed10 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  e the full pathn
1ed20 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61  ame in an alloca
1ed30 74 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74  ted buffer point
1ed40 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50  ed.  ** to by zP
1ed50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  athname, length 
1ed60 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69  nPathname. Or, i
1ed70 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  f this is a temp
1ed80 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a  orary file,.  **
1ed90 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74   leave both nPat
1eda0 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e  hname and zPathn
1edb0 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20  ame set to 0..  
1edc0 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
1edd0 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
1ede0 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74 68 6e  0] ){.    nPathn
1edf0 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  ame = pVfs->mxPa
1ee00 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50  thname+1;.    zP
1ee10 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
1ee20 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d  3Malloc(nPathnam
1ee30 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50  e*2);.    if( zP
1ee40 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  athname==0 ){.  
1ee50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ee60 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23  E_NOMEM;.    }.#
1ee70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1ee80 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20  IT_MEMORYDB.    
1ee90 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
1eea0 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29  name,":memory:")
1eeb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ==0 ){.      mem
1eec0 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50  Db = 1;.      zP
1eed0 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a  athname[0] = 0;.
1eee0 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
1eef0 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 50 61  .    {.      zPa
1ef00 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f  thname[0] = 0; /
1ef10 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74  * Make sure init
1ef20 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20  ialized even if 
1ef30 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66  FullPathname() f
1ef40 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20 72 63  ails */.      rc
1ef50 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
1ef60 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
1ef70 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Filename, nPathn
1ef80 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  ame, zPathname);
1ef90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 50 61 74  .    }..    nPat
1efa0 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  hname = sqlite3S
1efb0 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d  trlen30(zPathnam
1efc0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
1efd0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61  SQLITE_OK && nPa
1efe0 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d  thname+8>pVfs->m
1eff0 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  xPathname ){.   
1f000 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
1f010 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20  h is taken when 
1f020 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68  the journal path
1f030 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20   required by.   
1f040 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
1f050 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  se being opened 
1f060 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61  will be more tha
1f070 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  n pVfs->mxPathna
1f080 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65  me.      ** byte
1f090 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69  s in length. Thi
1f0a0 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  s means the data
1f0b0 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f  base cannot be o
1f0c0 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20  pened,.      ** 
1f0d0 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  as it will not b
1f0e0 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70  e possible to op
1f0f0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
1f100 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20  ile or even.    
1f110 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61    ** check for a
1f120 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66   hot-journal bef
1f130 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20  ore reading..   
1f140 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
1f150 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
1f160 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1f170 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1f180 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1f190 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
1f1a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1f1b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1f1c0 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
1f1d0 20 66 6f 72 20 74 68 65 20 50 61 67 65 72 20 73   for the Pager s
1f1e0 74 72 75 63 74 75 72 65 2c 20 50 43 61 63 68 65  tructure, PCache
1f1f0 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a   object, the.  *
1f200 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73  * three file des
1f210 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61  criptors, the da
1f220 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
1f230 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
1f240 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65   .  ** file name
1f250 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20  . The layout in 
1f260 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c  memory is as fol
1f270 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lows:.  **.  ** 
1f280 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74      Pager object
1f290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2a0 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65      (sizeof(Page
1f2b0 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  r) bytes).  **  
1f2c0 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74     PCache object
1f2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2e0 20 20 20 28 73 71 6c 69 74 65 33 50 63 61 63 68     (sqlite3Pcach
1f2f0 65 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20  eSize() bytes). 
1f300 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65   **     Database
1f310 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
1f320 20 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73          (pVfs->s
1f330 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20  zOsFile bytes). 
1f340 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72   **     Sub-jour
1f350 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
1f360 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c          (journal
1f370 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a  FileSize bytes).
1f380 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f    **     Main jo
1f390 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
1f3a0 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61  e        (journa
1f3b0 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29  lFileSize bytes)
1f3c0 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61  .  **     Databa
1f3d0 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20  se file name    
1f3e0 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68            (nPath
1f3f0 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20  name+1 bytes).  
1f400 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
1f410 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20  ile name        
1f420 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d         (nPathnam
1f430 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a  e+8+1 bytes).  *
1f440 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a  /.  pPtr = (u8 *
1f450 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
1f460 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73  ro(.    ROUND8(s
1f470 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20  izeof(*pPager)) 
1f480 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20  +      /* Pager 
1f490 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
1f4a0 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69   ROUND8(pcacheSi
1f4b0 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  ze) +           
1f4c0 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  /* PCache object
1f4d0 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70   */.    ROUND8(p
1f4e0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b  Vfs->szOsFile) +
1f4f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
1f500 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20  in db file */.  
1f510 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
1f520 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20  e * 2 +         
1f530 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72   /* The two jour
1f540 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20  nal files */ .  
1f550 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20    nPathname + 1 
1f560 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +               
1f570 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f   /* zFilename */
1f580 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b  .    nPathname +
1f590 20 38 20 2b 20 31 20 20 20 20 20 20 20 20 20 20   8 + 1          
1f5a0 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20      /* zJournal 
1f5b0 2a 2f 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  */.  );.  assert
1f5c0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
1f5d0 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e  GNMENT(SQLITE_IN
1f5e0 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c  T_TO_PTR(journal
1f5f0 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20  FileSize)) );.  
1f600 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20  if( !pPtr ){.   
1f610 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
1f620 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
1f630 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1f640 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20  M;.  }.  pPager 
1f650 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  =              (
1f660 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20  Pager*)(pPtr);. 
1f670 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
1f680 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28   =    (PCache*)(
1f690 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73  pPtr += ROUND8(s
1f6a0 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29  izeof(*pPager)))
1f6b0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d  ;.  pPager->fd =
1f6c0 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65     (sqlite3_file
1f6d0 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
1f6e0 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a  8(pcacheSize));.
1f6f0 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d    pPager->sjfd =
1f700 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
1f710 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
1f720 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29  pVfs->szOsFile))
1f730 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  ;.  pPager->jfd 
1f740 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  =  (sqlite3_file
1f750 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e  *)(pPtr += journ
1f760 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70  alFileSize);.  p
1f770 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
1f780 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50   =    (char*)(pP
1f790 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c  tr += journalFil
1f7a0 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74  eSize);.  assert
1f7b0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
1f7c0 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a  GNMENT(pPager->j
1f7d0 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  fd) );..  /* Fil
1f7e0 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a  l in the Pager.z
1f7f0 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67  Filename and Pag
1f800 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66  er.zJournal buff
1f810 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64  ers, if required
1f820 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68  . */.  if( zPath
1f830 6e 61 6d 65 20 29 7b 0a 20 20 20 20 70 50 61 67  name ){.    pPag
1f840 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20  er->zJournal =  
1f850 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d   (char*)(pPtr +=
1f860 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 29 3b   nPathname + 1);
1f870 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
1f880 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
1f890 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
1f8a0 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ame);.    memcpy
1f8b0 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
1f8c0 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  l, zPathname, nP
1f8d0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
1f8e0 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a  mcpy(&pPager->zJ
1f8f0 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
1f900 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38  ], "-journal", 8
1f910 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
1f920 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  r->zFilename[0]=
1f930 3d 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  =0 ) pPager->zJo
1f940 75 72 6e 61 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20  urnal[0] = 0;.  
1f950 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1f960 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  Pathname);.  }. 
1f970 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20   pPager->pVfs = 
1f980 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pVfs;.  pPager->
1f990 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c  vfsFlags = vfsFl
1f9a0 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  ags;..  /* Open 
1f9b0 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
1f9c0 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
1f9d0 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
1f9e0 65 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29  e[0] && !memDb )
1f9f0 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d  {.    int fout =
1fa00 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1fa10 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c         /* VFS fl
1fa20 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ags returned by 
1fa30 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72  xOpen() */.    r
1fa40 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
1fa50 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
1fa60 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
1fa70 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c  r->fd, vfsFlags,
1fa80 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 72 65 61   &fout);.    rea
1fa90 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51  dOnly = (fout&SQ
1faa0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
1fab0 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  LY);..    /* If 
1fac0 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75 63  the file was suc
1fad0 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64  cessfully opened
1fae0 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
1faf0 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63  access,.    ** c
1fb00 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20  hoose a default 
1fb10 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73  page size in cas
1fb20 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65  e we have to cre
1fb30 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ate the.    ** d
1fb40 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
1fb50 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
1fb60 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d  ize is the maxim
1fb70 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20  um of:.    **.  
1fb80 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45    **    + SQLITE
1fb90 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
1fba0 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20  ZE,.    **    + 
1fbb0 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
1fbc0 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53  ed by sqlite3OsS
1fbd0 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
1fbe0 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67  **    + The larg
1fbf0 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68  est page size th
1fc00 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  at can be writte
1fc10 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20  n atomically..  
1fc20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
1fc30 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72  =SQLITE_OK && !r
1fc40 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
1fc50 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
1fc60 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
1fc70 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41  sert(SQLITE_DEFA
1fc80 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53  ULT_PAGE_SIZE<=S
1fc90 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
1fca0 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  T_PAGE_SIZE);.  
1fcb0 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44 66      if( szPageDf
1fcc0 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  lt<pPager->secto
1fcd0 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  rSize ){.       
1fce0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63   if( pPager->sec
1fcf0 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  torSize>SQLITE_M
1fd00 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
1fd10 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
1fd20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53    szPageDflt = S
1fd30 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
1fd40 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20  T_PAGE_SIZE;.   
1fd50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1fd60 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
1fd70 20 3d 20 28 75 31 36 29 70 50 61 67 65 72 2d 3e   = (u16)pPager->
1fd80 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
1fd90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69      }.      }.#i
1fda0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1fdb0 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
1fdc0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
1fdd0 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
1fde0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
1fdf0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
1fe00 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  >fd);.        in
1fe10 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73  t ii;.        as
1fe20 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
1fe30 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
1fe40 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  2>>8));.        
1fe50 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
1fe60 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28  CAP_ATOMIC64K==(
1fe70 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20  65536>>8));.    
1fe80 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
1fe90 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
1fea0 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b  GE_SIZE<=65536);
1feb0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d  .        for(ii=
1fec0 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d  szPageDflt; ii<=
1fed0 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
1fee0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69  LT_PAGE_SIZE; ii
1fef0 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20  =ii*2){.        
1ff00 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54    if( iDc&(SQLIT
1ff10 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
1ff20 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20  ii>>8)) ){.     
1ff30 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
1ff40 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20  t = ii;.        
1ff50 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1ff60 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1ff70 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1ff80 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72  /* If a temporar
1ff90 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73  y file is reques
1ffa0 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f  ted, it is not o
1ffb0 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  pened immediatel
1ffc0 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  y..    ** In thi
1ffd0 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74  s case we accept
1ffe0 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
1fff0 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79  e size and delay
20000 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a   actually.    **
20010 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c   opening the fil
20020 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73  e until the firs
20030 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74  t call to OsWrit
20040 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
20050 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  ** This branch i
20060 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61  s also run for a
20070 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
20080 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f  base. An in-memo
20090 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  ry.    ** databa
200a0 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  se is the same a
200b0 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68  s a temp-file th
200c0 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  at is never writ
200d0 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a  ten out to.    *
200e0 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20  * disk and uses 
200f0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c  an in-memory rol
20100 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20  lback journal.. 
20110 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46     */ .    tempF
20120 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ile = 1;.    pPa
20130 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
20140 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
20150 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66    readOnly = (vf
20160 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
20170 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20  EN_READONLY);.  
20180 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
20190 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61  owing call to Pa
201a0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
201b0 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74   serves to set t
201c0 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a  he value of .  *
201d0 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  * Pager.pageSize
201e0 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65   and to allocate
201f0 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53   the Pager.pTmpS
20200 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a  pace buffer..  *
20210 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
20220 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
20230 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d  ert( pPager->mem
20240 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  Db==0 );.    rc 
20250 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
20260 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
20270 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d  , &szPageDflt, -
20280 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
20290 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
202a0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
202b0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  an error occurre
202c0 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74  d in either of t
202d0 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c  he blocks above,
202e0 20 66 72 65 65 20 74 68 65 20 0a 20 20 2a 2a 20   free the .  ** 
202f0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
20300 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69  and close the fi
20310 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  le..  */.  if( r
20320 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
20330 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
20340 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  ger->pTmpSpace )
20350 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  ;.    sqlite3OsC
20360 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
20370 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
20380 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ee(pPager);.    
20390 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
203a0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
203b0 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63  the PCache objec
203c0 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  t. */.  assert( 
203d0 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20  nExtra<1000 );. 
203e0 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38   nExtra = ROUND8
203f0 28 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69  (nExtra);.  sqli
20400 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a  te3PcacheOpen(sz
20410 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61  PageDflt, nExtra
20420 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20  , !memDb,.      
20430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d                !m
20440 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73  emDb?pagerStress
20450 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67  :0, (void *)pPag
20460 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61  er, pPager->pPCa
20470 63 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52  che);..  PAGERTR
20480 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE(("OPEN %d %s
20490 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
204a0 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70  D(pPager->fd), p
204b0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
204c0 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
204d0 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70  OPEN %p %s\n", p
204e0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a  Pager, pPager->z
204f0 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50  Filename))..  pP
20500 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
20510 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61   = (u8)useJourna
20520 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52  l;.  pPager->noR
20530 65 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65 61  eadlock = (noRea
20540 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c  dlock && readOnl
20550 79 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70 50  y) ?1:0;.  /* pP
20560 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
20570 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
20580 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
20590 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
205a0 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a  r->nRef = 0; */.
205b0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
205c0 56 61 6c 69 64 20 3d 20 28 75 38 29 6d 65 6d 44  Valid = (u8)memD
205d0 62 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  b;.  /* pPager->
205e0 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  stmtSize = 0; */
205f0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
20600 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  mtJSize = 0; */.
20610 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61    /* pPager->nPa
20620 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  ge = 0; */.  pPa
20630 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51  ger->mxPgno = SQ
20640 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f  LITE_MAX_PAGE_CO
20650 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  UNT;.  /* pPager
20660 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
20670 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73  UNLOCK; */.  ass
20680 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
20690 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20  te == (tempFile 
206a0 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ? PAGER_EXCLUSIV
206b0 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  E : PAGER_UNLOCK
206c0 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  ) );.  /* pPager
206d0 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a  ->errMask = 0; *
206e0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  /.  pPager->temp
206f0 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46  File = (u8)tempF
20700 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74  ile;.  assert( t
20710 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
20720 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
20730 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  L .          || 
20740 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
20750 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
20760 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72  USIVE );.  asser
20770 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
20780 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d  MODE_EXCLUSIVE==
20790 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  1 );.  pPager->e
207a0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28  xclusiveMode = (
207b0 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20  u8)tempFile; .  
207c0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
207d0 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
207e0 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
207f0 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75  ager->memDb = (u
20800 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65  8)memDb;.  pPage
20810 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75  r->readOnly = (u
20820 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a  8)readOnly;.  /*
20830 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
20840 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 61 73 73 65  c = 0; */.  asse
20850 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c  rt( useJournal |
20860 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
20870 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  le );.  pPager->
20880 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  noSync = pPager-
20890 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
208a0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
208b0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f  pPager->noSync ?
208c0 30 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  0:1;.  pPager->s
208d0 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49  ync_flags = SQLI
208e0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
208f0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
20900 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  rst = 0; */.  /*
20910 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
20920 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20  ynced = 0; */.  
20930 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  /* pPager->pLast
20940 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
20950 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36  r->nExtra = (u16
20960 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65  )nExtra;.  pPage
20970 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
20980 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  mit = SQLITE_DEF
20990 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a  AULT_JOURNAL_SIZ
209a0 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72  E_LIMIT;.  asser
209b0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
209c0 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c  ->fd) || tempFil
209d0 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72  e );.  setSector
209e0 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
209f0 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20  if( !useJournal 
20a00 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
20a10 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
20a20 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
20a30 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  FF;.  }else if( 
20a40 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61  memDb ){.    pPa
20a50 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
20a60 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
20a70 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d  MODE_MEMORY;.  }
20a80 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42  .  /* pPager->xB
20a90 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20  usyHandler = 0; 
20aa0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
20ab0 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
20ac0 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
20ad0 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52  ->xReiniter = xR
20ae0 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73  einit;.  /* mems
20af0 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
20b00 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
20b10 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a  er->aHash)); */.
20b20 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61    *ppPager = pPa
20b30 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ger;.  return SQ
20b40 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a  LITE_OK;.}..../*
20b50 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
20b60 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  n is called afte
20b70 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20  r transitioning 
20b80 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  from PAGER_UNLOC
20b90 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48  K to.** PAGER_SH
20ba0 41 52 45 44 20 73 74 61 74 65 2e 20 49 74 20 74  ARED state. It t
20bb0 65 73 74 73 20 69 66 20 74 68 65 72 65 20 69 73  ests if there is
20bc0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70   a hot journal p
20bd0 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65  resent in.** the
20be0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72   file-system for
20bf0 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
20c00 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  . A hot journal 
20c10 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20  is one that .** 
20c20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
20c30 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69  ed back. Accordi
20c40 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ng to this funct
20c50 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  ion, a hot-journ
20c60 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74  al.** file exist
20c70 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s if the followi
20c80 6e 67 20 63 72 69 74 65 72 69 61 20 61 72 65 20  ng criteria are 
20c90 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  met:.**.**   * T
20ca0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
20cb0 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69  exists in the fi
20cc0 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a  le system, and.*
20cd0 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73  *   * No process
20ce0 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45   holds a RESERVE
20cf0 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
20d00 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
20d10 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20  e file, and.**  
20d20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20   * The database 
20d30 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67  file itself is g
20d40 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79  reater than 0 by
20d50 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64  tes in size, and
20d60 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73  .**   * The firs
20d70 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f  t byte of the jo
20d80 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
20d90 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30  s and is not 0x0
20da0 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  0..**.** If the 
20db0 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
20dc0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20dd0 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75  e is 0 but a jou
20de0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69  rnal file.** exi
20df0 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f  sts, that is pro
20e00 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75  bably an old jou
20e10 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66  rnal left over f
20e20 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64  rom a prior.** d
20e30 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
20e40 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74   same name. In t
20e50 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75  his case the jou
20e60 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20  rnal file is.** 
20e70 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75 73 69  just deleted usi
20e80 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45  ng OsDelete, *pE
20e90 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20  xists is set to 
20ea0 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a  0 and SQLITE_OK.
20eb0 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ** is returned..
20ec0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
20ed0 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63  ne does not chec
20ee0 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  k if there is a 
20ef0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
20f00 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68  ilename.** at th
20f10 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
20f20 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c 20  e. If there is, 
20f30 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72 20  and that master 
20f40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
20f50 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
20f60 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
20f70 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
20f80 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73  lly hot. In this
20f90 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f  .** case this ro
20fa0 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
20fb0 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  n a false-positi
20fc0 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c  ve. The pager_pl
20fd0 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  ayback().** rout
20fe0 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65  ine will discove
20ff0 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  r that the journ
21000 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72  al file is not r
21010 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a  eally hot and .*
21020 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20  * will not roll 
21030 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20  it back. .**.** 
21040 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  If a hot-journal
21050 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74   file is found t
21060 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74  o exist, *pExist
21070 73 20 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e  s is set to 1 an
21080 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  d .** SQLITE_OK 
21090 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20  returned. If no 
210a0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
210b0 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45   is present, *pE
210c0 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20  xists is.** set 
210d0 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f  to 0 and SQLITE_
210e0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
210f0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
21100 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a  rs while trying.
21110 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
21120 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
21130 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
21140 65 20 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f  e exists, the IO
21150 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69   error.** code i
21160 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
21170 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78  he value of *pEx
21180 69 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65  ists is undefine
21190 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
211a0 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50   hasHotJournal(P
211b0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
211c0 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73  t *pExists){.  s
211d0 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
211e0 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
211f0 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63  ->pVfs;.  int rc
21200 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21210 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
21220 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
21230 65 78 69 73 74 73 3b 20 20 20 20 20 20 20 20 20  exists;         
21240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
21250 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  e if a journal f
21260 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ile is present *
21270 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
21280 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
21290 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
212a0 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
212b0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
212c0 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65  r->fd) );.  asse
212d0 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  rt( !isOpen(pPag
212e0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2a  er->jfd) );..  *
212f0 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 72  pExists = 0;.  r
21300 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
21310 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72  ess(pVfs, pPager
21320 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  ->zJournal, SQLI
21330 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
21340 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 69 66  , &exists);.  if
21350 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21360 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20  && exists ){.   
21370 20 69 6e 74 20 6c 6f 63 6b 65 64 3b 20 20 20 20   int locked;    
21380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21390 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f  True if some pro
213a0 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53  cess holds a RES
213b0 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20  ERVED lock */.. 
213c0 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69     /* Race condi
213d0 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74  tion here:  Anot
213e0 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68  her process migh
213f0 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64  t have been hold
21400 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  ing the.    ** t
21410 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
21420 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72   and have a jour
21430 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20  nal open at the 
21440 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
21450 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61  ) .    ** call a
21460 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64  bove, but then d
21470 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
21480 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c  l and drop the l
21490 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  ock before.    *
214a0 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68 65 20  * we get to the 
214b0 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65  following sqlite
214c0 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
214d0 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66  Lock() call.  If
214e0 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20   that.    ** is 
214f0 74 68 65 20 63 61 73 65 2c 20 74 68 69 73 20 72  the case, this r
21500 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69  outine might thi
21510 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  nk there is a ho
21520 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20  t journal when. 
21530 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68     ** in fact th
21540 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68  ere is none.  Th
21550 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  is results in a 
21560 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77  false-positive w
21570 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  hich will.    **
21580 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62   be dealt with b
21590 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72  y the playback r
215a0 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20  outine.  Ticket 
215b0 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20  #3883..    */.  
215c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
215d0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
215e0 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c  k(pPager->fd, &l
215f0 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20  ocked);.    if( 
21600 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
21610 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20   !locked ){.    
21620 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20    int nPage;..  
21630 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65      /* Check the
21640 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
21650 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 69  abase file. If i
21660 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 30 20  t consists of 0 
21670 70 61 67 65 73 2c 0a 20 20 20 20 20 20 2a 2a 20  pages,.      ** 
21680 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20  then delete the 
21690 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65  journal file. Se
216a0 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  e the header com
216b0 6d 65 6e 74 20 61 62 6f 76 65 20 66 6f 72 20 0a  ment above for .
216c0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 61        ** the rea
216d0 73 6f 6e 69 6e 67 20 68 65 72 65 2e 20 20 44 65  soning here.  De
216e0 6c 65 74 65 20 74 68 65 20 6f 62 73 6f 6c 65 74  lete the obsolet
216f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75  e journal file u
21700 6e 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 61 20  nder.      ** a 
21710 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f  RESERVED lock to
21720 20 61 76 6f 69 64 20 72 61 63 65 20 63 6f 6e 64   avoid race cond
21730 69 74 69 6f 6e 73 20 61 6e 64 20 74 6f 20 61 76  itions and to av
21740 6f 69 64 20 76 69 6f 6c 61 74 69 6e 67 0a 20 20  oid violating.  
21750 20 20 20 20 2a 2a 20 5b 48 33 33 30 32 30 5d 2e      ** [H33020].
21760 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
21770 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
21780 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
21790 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
217a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
217b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
217c0 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20  f( nPage==0 ){. 
217d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
217e0 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
217f0 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  c();.          i
21800 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
21810 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
21820 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21830 20 20 7c 7c 20 20 73 71 6c 69 74 65 33 4f 73 4c    ||  sqlite3OsL
21840 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
21850 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d  RESERVED_LOCK)==
21860 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21870 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21880 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70  OsDelete(pVfs, p
21890 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
218a0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
218b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
218c0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
218d0 41 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20  ARED );.        
218e0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
218f0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41  state==PAGER_SHA
21900 52 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  RED ){.         
21910 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
21920 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
21930 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
21940 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
21950 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21960 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
21970 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
21980 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21990 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75        /* The jou
219a0 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
219b0 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f   and no other co
219c0 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20 72  nnection has a r
219d0 65 73 65 72 76 65 64 0a 20 20 20 20 20 20 20 20  eserved.        
219e0 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20    ** or greater 
219f0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
21a00 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63  base file. Now c
21a10 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65 20  heck that there 
21a20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
21a30 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e  at least one non
21a40 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20 74  -zero bytes at t
21a50 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
21a60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
21a70 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68          ** If th
21a80 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65 20  ere is, then we 
21a90 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a 6f  consider this jo
21aa0 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e  urnal to be hot.
21ab0 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20   If not, .      
21ac0 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
21ad0 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20   ignored..      
21ae0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
21af0 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f   int f = SQLITE_
21b00 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
21b10 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
21b20 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20  OURNAL;.        
21b30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
21b40 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
21b50 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
21b60 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29  ger->jfd, f, &f)
21b70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
21b80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20  .            u8 
21ba0 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  first = 0;.     
21bb0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
21bc0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
21bd0 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26  ->jfd, (void *)&
21be0 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20  first, 1, 0);.  
21bf0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
21c00 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
21c10 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
21c20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
21c30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
21c40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21c50 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
21c60 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
21c70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  ;.            *p
21c80 45 78 69 73 74 73 20 3d 20 28 66 69 72 73 74 21  Exists = (first!
21c90 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  =0);.          }
21ca0 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
21cb0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a  ITE_CANTOPEN ){.
21cc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
21cd0 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  f we cannot open
21ce0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
21cf0 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72  urnal file in or
21d00 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a 20 20  der to see if.  
21d10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 73            ** its
21d20 20 68 61 73 20 61 20 7a 65 72 6f 20 68 65 61 64   has a zero head
21d30 65 72 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62  er, that might b
21d40 65 20 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20  e due to an I/O 
21d50 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20  error, or.      
21d60 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68        ** it migh
21d70 74 20 62 65 20 64 75 65 20 74 6f 20 74 68 65 20  t be due to the 
21d80 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64  race condition d
21d90 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 61  escribed above a
21da0 6e 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20  nd in.          
21db0 20 20 2a 2a 20 74 69 63 6b 65 74 20 23 33 38 38    ** ticket #388
21dc0 33 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20  3.  Either way, 
21dd0 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
21de0 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a  journal is hot..
21df0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54              ** T
21e00 68 69 73 20 6d 69 67 68 74 20 62 65 20 61 20 66  his might be a f
21e10 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 20 20  alse positive.  
21e20 42 75 74 20 69 66 20 69 74 20 69 73 2c 20 74 68  But if it is, th
21e30 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  en the.         
21e40 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20     ** automatic 
21e50 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b  journal playback
21e60 20 61 6e 64 20 72 65 63 6f 76 65 72 79 20 6d 65   and recovery me
21e70 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61  chanism will dea
21e80 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  l.            **
21e90 20 77 69 74 68 20 69 74 20 75 6e 64 65 72 20 61   with it under a
21ea0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
21eb0 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74   where we do not
21ec0 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20   need to.       
21ed0 20 20 20 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f       ** worry so
21ee0 20 6d 75 63 68 20 77 69 74 68 20 72 61 63 65 20   much with race 
21ef0 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20  conditions..    
21f00 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
21f10 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
21f20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
21f30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21f40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
21f50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
21f60 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
21f70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21f80 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  Read the content
21f90 20 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75   for page pPg ou
21fa0 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
21fb0 65 20 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20  e file and into 
21fc0 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e 20  .** pPg->pData. 
21fd0 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72  A shared lock or
21fe0 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65   greater must be
21ff0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
22000 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65  abase.** file be
22010 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  fore this functi
22020 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  on is called..**
22030 0a 2a 2a 20 49 66 20 70 61 67 65 20 31 20 69 73  .** If page 1 is
22040 20 72 65 61 64 2c 20 74 68 65 6e 20 74 68 65 20   read, then the 
22050 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
22060 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 73  bFileVers[] is s
22070 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c  et to.** the val
22080 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
22090 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
220a0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65  **.** If an IO e
220b0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
220c0 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 69  n the IO error i
220d0 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
220e0 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68  e caller..** Oth
220f0 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
22100 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
22110 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
22120 64 44 62 50 61 67 65 28 50 67 48 64 72 20 2a 70  dDbPage(PgHdr *p
22130 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
22140 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
22150 65 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a  er; /* Pager obj
22160 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ect associated w
22170 69 74 68 20 70 61 67 65 20 70 50 67 20 2a 2f 0a  ith page pPg */.
22180 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
22190 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f  g->pgno;       /
221a0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
221b0 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72   read */.  int r
221c0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
221d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
221e0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 36 34 20  n code */.  i64 
221f0 69 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  iOffset;        
22200 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
22210 20 6f 66 66 73 65 74 20 6f 66 20 66 69 6c 65 20   offset of file 
22220 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
22230 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
22240 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
22250 53 48 41 52 45 44 20 26 26 20 21 4d 45 4d 44 42  SHARED && !MEMDB
22260 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
22270 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
22280 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52   );..  if( NEVER
22290 28 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  (!isOpen(pPager-
222a0 3e 66 64 29 29 20 29 7b 0a 20 20 20 20 61 73 73  >fd)) ){.    ass
222b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d  ert( pPager->tem
222c0 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 6d 65 6d  pFile );.    mem
222d0 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20  set(pPg->pData, 
222e0 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
222f0 69 7a 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ize);.    return
22300 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
22310 20 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e    iOffset = (pgn
22320 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
22330 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 72 63  ->pageSize;.  rc
22340 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
22350 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67  (pPager->fd, pPg
22360 2d 3e 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  ->pData, pPager-
22370 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 73  >pageSize, iOffs
22380 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  et);.  if( rc==S
22390 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
223a0 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 72 63  T_READ ){.    rc
223b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
223c0 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20  }.  if( pgno==1 
223d0 29 7b 0a 20 20 20 20 75 38 20 2a 64 62 46 69 6c  ){.    u8 *dbFil
223e0 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70  eVers = &((u8*)p
223f0 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a  Pg->pData)[24];.
22400 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
22410 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
22420 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
22430 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
22440 65 56 65 72 73 29 29 3b 0a 20 20 7d 0a 20 20 43  eVers));.  }.  C
22450 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 50  ODEC1(pPager, pP
22460 67 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20  g->pData, pgno, 
22470 33 2c 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  3, rc = SQLITE_N
22480 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41 47 45 52 5f  OMEM);..  PAGER_
22490 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
224a0 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29  er_readdb_count)
224b0 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70  ;.  PAGER_INCR(p
224c0 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20  Pager->nRead);. 
224d0 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20   IOTRACE(("PGIN 
224e0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
224f0 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45  , pgno));.  PAGE
22500 52 54 52 41 43 45 28 28 22 46 45 54 43 48 20 25  RTRACE(("FETCH %
22510 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
22520 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
22530 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
22540 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
22550 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
22560 67 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  g)));..  return 
22570 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
22580 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
22590 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61  lled to obtain a
225a0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
225b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
225c0 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65  e..** It is ille
225d0 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  gal to call sqli
225e0 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
225f0 29 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68  ) until after th
22600 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68  is function.** h
22610 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66  as been successf
22620 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66 20  ully called. If 
22630 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73  a shared-lock is
22640 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 77 68   already held wh
22650 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  en.** this funct
22660 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
22670 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  t is a no-op..**
22680 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
22690 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65  g operations are
226a0 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64 20   also performed 
226b0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
226c0 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20  ..**.**   1) If 
226d0 74 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72  the pager is cur
226e0 72 65 6e 74 6c 79 20 69 6e 20 50 41 47 45 52 5f  rently in PAGER_
226f0 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 28 6e 6f  UNLOCK state (no
22700 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20   lock held.**   
22710 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61     on the databa
22720 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e 20 61  se file), then a
22730 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
22740 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a  e to obtain a.**
22750 20 20 20 20 20 20 53 48 41 52 45 44 20 6c 6f 63        SHARED loc
22760 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
22770 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74  e file. Immediat
22780 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e  ely after obtain
22790 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20  ing.**      the 
227a0 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
227b0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20   file-system is 
227c0 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20 68 6f  checked for a ho
227d0 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20  t-journal,.**   
227e0 20 20 20 77 68 69 63 68 20 69 73 20 70 6c 61 79     which is play
227f0 65 64 20 62 61 63 6b 20 69 66 20 70 72 65 73 65  ed back if prese
22800 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e  nt. Following an
22810 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a  y hot-journal .*
22820 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c  *      rollback,
22830 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
22840 20 74 68 65 20 63 61 63 68 65 20 61 72 65 20 76   the cache are v
22850 61 6c 69 64 61 74 65 64 20 62 79 20 63 68 65 63  alidated by chec
22860 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  king.**      the
22870 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72   'change-counter
22880 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 64  ' field of the d
22890 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
228a0 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  der and.**      
228b0 64 69 73 63 61 72 64 65 64 20 69 66 20 74 68 65  discarded if the
228c0 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f 20 62  y are found to b
228d0 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a  e invalid..**.**
228e0 20 20 20 32 29 20 49 66 20 74 68 65 20 70 61 67     2) If the pag
228f0 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
22900 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c   exclusive-mode,
22910 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 63   and there are c
22920 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20  urrently.**     
22930 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
22940 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6e  references to an
22950 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69 73 20  y pages, and is 
22960 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
22970 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e  te,.**      then
22980 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
22990 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74 68 65  ade to clear the
229a0 20 65 72 72 6f 72 20 73 74 61 74 65 20 62 79 20   error state by 
229b0 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20  discarding.**   
229c0 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20     the contents 
229d0 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68  of the page cach
229e0 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61  e and rolling ba
229f0 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72  ck any open jour
22a00 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65  nal.**      file
22a10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ..**.** If the o
22a20 70 65 72 61 74 69 6f 6e 20 64 65 73 63 72 69 62  peration describ
22a30 65 64 20 62 79 20 28 32 29 20 61 62 6f 76 65 20  ed by (2) above 
22a40 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64  is not attempted
22a50 2c 20 61 6e 64 20 69 66 20 74 68 65 0a 2a 2a 20  , and if the.** 
22a60 70 61 67 65 72 20 69 73 20 69 6e 20 61 6e 20 65  pager is in an e
22a70 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72  rror state other
22a80 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c   than SQLITE_FUL
22a90 4c 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63  L when this is c
22aa0 61 6c 6c 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72  alled,.** the er
22ab0 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
22ac0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
22ad0 2e 20 49 74 20 69 73 20 70 65 72 6d 69 74 74 65  . It is permitte
22ae0 64 20 74 6f 20 72 65 61 64 20 74 68 65 0a 2a 2a  d to read the.**
22af0 20 64 61 74 61 62 61 73 65 20 77 68 65 6e 20 69   database when i
22b00 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 65 72  n SQLITE_FULL er
22b10 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ror state..**.**
22b20 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 65   Otherwise, if e
22b30 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
22b40 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
22b50 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
22b60 49 66 20 61 6e 0a 2a 2a 20 49 4f 20 65 72 72 6f  If an.** IO erro
22b70 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6c  r occurs while l
22b80 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62  ocking the datab
22b90 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f  ase, checking fo
22ba0 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a  r a hot-journal.
22bb0 2a 2a 20 66 69 6c 65 20 6f 72 20 72 6f 6c 6c 69  ** file or rolli
22bc0 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ng back a journa
22bd0 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20 65  l file, the IO e
22be0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
22bf0 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
22c00 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64  lite3PagerShared
22c10 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  Lock(Pager *pPag
22c20 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
22c30 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
22c40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
22c50 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
22c60 74 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 3d  t isErrorReset =
22c70 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
22c80 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 63 6f   /* True if reco
22c90 76 65 72 69 6e 67 20 66 72 6f 6d 20 65 72 72 6f  vering from erro
22ca0 72 20 73 74 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a  r state */..  /*
22cb0 20 49 66 20 74 68 69 73 20 64 61 74 61 62 61 73   If this databas
22cc0 65 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e  e has no outstan
22cd0 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65  ding page refere
22ce0 6e 63 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61  nces and is in a
22cf0 6e 20 0a 20 20 2a 2a 20 65 72 72 6f 72 2d 73 74  n .  ** error-st
22d00 61 74 65 2c 20 74 68 69 73 20 69 73 20 61 20 63  ate, this is a c
22d10 68 61 6e 63 65 20 74 6f 20 63 6c 65 61 72 20 74  hance to clear t
22d20 68 65 20 65 72 72 6f 72 2e 20 44 69 73 63 61 72  he error. Discar
22d30 64 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f 6e 74  d the .  ** cont
22d40 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
22d50 72 2d 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c  r-cache and roll
22d60 62 61 63 6b 20 61 6e 79 20 68 6f 74 20 6a 6f 75  back any hot jou
22d70 72 6e 61 6c 20 69 6e 20 74 68 65 0a 20 20 2a 2a  rnal in the.  **
22d80 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 20 20   file-system..  
22d90 2a 2f 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20  */.  if( !MEMDB 
22da0 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  && sqlite3Pcache
22db0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
22dc0 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 26 26 20  >pPCache)==0 && 
22dd0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
22de0 29 7b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65  ){.    if( isOpe
22df0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
22e00 7c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  | pPager->zJourn
22e10 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 73 45 72  al ){.      isEr
22e20 72 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a 20 20  rorReset = 1;.  
22e30 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
22e40 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45  errCode = SQLITE
22e50 5f 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72 5f 72  _OK;.    pager_r
22e60 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
22e70 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  }..  /* If the p
22e80 61 67 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e  ager is still in
22e90 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c   an error state,
22ea0 20 64 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 2e   do not proceed.
22eb0 20 54 68 65 20 65 72 72 6f 72 20 0a 20 20 2a 2a   The error .  **
22ec0 20 73 74 61 74 65 20 77 69 6c 6c 20 62 65 20 63   state will be c
22ed0 6c 65 61 72 65 64 20 61 74 20 73 6f 6d 65 20 70  leared at some p
22ee0 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
22ef0 72 65 20 77 68 65 6e 20 61 6c 6c 20 70 61 67 65  re when all page
22f00 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65   .  ** reference
22f10 73 20 61 72 65 20 64 72 6f 70 70 65 64 20 61 6e  s are dropped an
22f20 64 20 74 68 65 20 63 61 63 68 65 20 63 61 6e 20  d the cache can 
22f30 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20 20  be discarded..  
22f40 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
22f50 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67  >errCode && pPag
22f60 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
22f70 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_FULL ){.    
22f80 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
22f90 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 69  rrCode;.  }..  i
22fa0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
22fb0 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c  ==PAGER_UNLOCK |
22fc0 7c 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 29  | isErrorReset )
22fd0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
22fe0 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d  s * const pVfs =
22ff0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
23000 20 20 20 69 6e 74 20 69 73 48 6f 74 4a 6f 75 72     int isHotJour
23010 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  nal = 0;.    ass
23020 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
23030 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
23040 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
23050 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
23060 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  )==0 );.    if( 
23070 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c  !pPager->noReadl
23080 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ock ){.      rc 
23090 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
230a0 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41  lock(pPager, SHA
230b0 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
230c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
230d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  OK ){.        as
230e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
230f0 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
23100 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  K );.        ret
23110 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
23120 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
23130 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
23140 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
23150 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  ==PAGER_UNLOCK )
23160 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
23170 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
23180 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ARED;.    }.    
23190 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
231a0 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f  state>=SHARED_LO
231b0 43 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  CK );..    /* If
231c0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
231d0 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72  exists, and ther
231e0 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44  e is no RESERVED
231f0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
23200 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
23210 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65  e, then it eithe
23220 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  r needs to be pl
23230 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c  ayed back or del
23240 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
23250 20 69 66 28 20 21 69 73 45 72 72 6f 72 52 65 73   if( !isErrorRes
23260 65 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  et ){.      rc =
23270 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70   hasHotJournal(p
23280 50 61 67 65 72 2c 20 26 69 73 48 6f 74 4a 6f 75  Pager, &isHotJou
23290 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  rnal);.      if(
232a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
232b0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  {.        goto f
232c0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ailed;.      }. 
232d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 45     }.    if( isE
232e0 72 72 6f 72 52 65 73 65 74 20 7c 7c 20 69 73 48  rrorReset || isH
232f0 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  otJournal ){.   
23300 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43     /* Get an EXC
23310 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
23320 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
23330 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
23340 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  it is.      ** i
23350 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20  mportant that a 
23360 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
23370 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e   not obtained on
23380 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a   the way to the.
23390 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49        ** EXCLUSI
233a0 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77  VE lock. If it w
233b0 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f  ere, another pro
233c0 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20  cess might open 
233d0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
233e0 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65  abase file, dete
233f0 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ct the RESERVED 
23400 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75  lock, and conclu
23410 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  de that the.    
23420 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
23430 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68   safe to read wh
23440 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
23450 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e   is still rollin
23460 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  g the .      ** 
23470 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  hot-journal back
23480 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
23490 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
234a0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45   intermediate RE
234b0 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
234c0 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  ot requested, an
234d0 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  y.      ** other
234e0 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74   process attempt
234f0 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68  ing to access th
23500 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
23510 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20  will get to .   
23520 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74     ** this point
23530 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
23540 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20   fail to obtain 
23550 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56  its own EXCLUSIV
23560 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a  E lock .      **
23570 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
23580 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   file..      */.
23590 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
235a0 2d 3e 73 74 61 74 65 3c 45 58 43 4c 55 53 49 56  ->state<EXCLUSIV
235b0 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  E_LOCK ){.      
235c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
235d0 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
235e0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
235f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
23600 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
23610 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
23620 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
23630 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20  , rc);.         
23640 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
23650 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23660 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
23670 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
23680 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20  .      }. .     
23690 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75   /* Open the jou
236a0 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72  rnal for read/wr
236b0 69 74 65 20 61 63 63 65 73 73 2e 20 54 68 69 73  ite access. This
236c0 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a   is because in .
236d0 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69        ** exclusi
236e0 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74  ve-access mode t
236f0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
23700 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20  or will be kept 
23710 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 2a  open and.      *
23720 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20  * possibly used 
23730 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
23740 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73  n later on. On s
23750 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65  ome systems, the
23760 0a 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e  .      ** OsTrun
23770 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64  cate() call used
23780 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
23790 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72  cess mode also r
237a0 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a  equires.      **
237b0 20 61 20 72 65 61 64 2f 77 72 69 74 65 20 66 69   a read/write fi
237c0 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20  le handle..     
237d0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69   */.      if( !i
237e0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
237f0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  d) ){.        in
23800 74 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72  t res;.        r
23810 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
23820 65 73 73 28 70 56 66 73 2c 70 50 61 67 65 72 2d  ess(pVfs,pPager-
23830 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45  >zJournal,SQLITE
23840 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 26  _ACCESS_EXISTS,&
23850 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  res);.        if
23860 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23870 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
23880 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20   res ){.        
23890 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30      int fout = 0
238a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
238b0 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  t f = SQLITE_OPE
238c0 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
238d0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
238e0 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
238f0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
23900 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
23910 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
23920 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
23930 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
23940 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
23950 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20  d, f, &fout);.  
23960 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
23970 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23980 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
23990 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20  ->jfd) );.      
239a0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
239b0 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26  LITE_OK && fout&
239c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
239d0 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ONLY ){.        
239e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
239f0 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20  E_CANTOPEN;.    
23a00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23a10 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
23a20 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  >jfd);.         
23a30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
23a40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
23a50 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    /* If the jour
23a60 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  nal does not exi
23a70 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d  st, it usually m
23a80 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a  eans that some .
23a90 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
23aa0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
23ab0 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69  managed to get i
23ac0 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61  n and roll it ba
23ad0 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20  ck before .     
23ae0 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
23af0 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e  onnection obtain
23b00 65 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  ed the exclusive
23b10 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c   lock above. Or,
23b20 20 69 74 20 0a 20 20 20 20 20 20 20 20 20 20 20   it .           
23b30 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61   ** may mean tha
23b40 74 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  t the pager was 
23b50 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61  in the error-sta
23b60 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20  te when this.   
23b70 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63           ** func
23b80 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20  tion was called 
23b90 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
23ba0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
23bb0 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ist.  */.       
23bc0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
23bd0 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
23be0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
23bf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23c00 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
23c10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23c20 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
23c30 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
23c40 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f  }..      /* TODO
23c50 3a 20 57 68 79 20 61 72 65 20 74 68 65 73 65 20  : Why are these 
23c60 63 6c 65 61 72 65 64 20 68 65 72 65 3f 20 49 73  cleared here? Is
23c70 20 69 74 20 6e 65 63 65 73 73 61 72 79 3f 20 2a   it necessary? *
23c80 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  /.      pPager->
23c90 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
23ca0 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
23cb0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
23cc0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
23cd0 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
23ce0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
23cf0 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20  rnalHdr = 0;. . 
23d00 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b       /* Playback
23d10 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
23d20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74  journal.  Drop t
23d30 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74  he database writ
23d40 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20  e.      ** lock 
23d50 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68  and reacquire th
23d60 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72  e read lock. Pur
23d70 67 65 20 74 68 65 20 63 61 63 68 65 20 62 65 66  ge the cache bef
23d80 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61  ore.      ** pla
23d90 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f  ying back the ho
23da0 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61  t-journal so tha
23db0 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75  t we don't end u
23dc0 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20  p with.      ** 
23dd0 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
23de0 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  cache..      */.
23df0 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e        if( isOpen
23e00 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
23e10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
23e20 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
23e30 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ger, 1);.       
23e40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
23e50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
23e60 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72  rc = pager_error
23e70 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
23e80 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
23e90 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  led;.        }. 
23ea0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
23eb0 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 73 74  ert( (pPager->st
23ec0 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
23ed0 44 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  D).           ||
23ee0 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   (pPager->exclus
23ef0 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65  iveMode && pPage
23f00 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53  r->state>PAGER_S
23f10 48 41 52 45 44 29 0a 20 20 20 20 20 20 29 3b 0a  HARED).      );.
23f20 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
23f30 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 7c  Pager->pBackup |
23f40 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  | sqlite3PcacheP
23f50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d  agecount(pPager-
23f60 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20  >pPCache)>0 ){. 
23f70 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
23f80 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74  ed-lock has just
23f90 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f   been acquired o
23fa0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
23fb0 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ile.      ** and
23fc0 20 74 68 65 72 65 20 61 72 65 20 61 6c 72 65 61   there are alrea
23fd0 64 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  dy pages in the 
23fe0 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72  cache (from a pr
23ff0 65 76 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20  evious.      ** 
24000 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
24010 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65  ansaction).  Che
24020 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
24030 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
24040 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  ** has been modi
24050 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61  fied.  If the da
24060 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67  tabase has chang
24070 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20  ed, flush the.  
24080 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20      ** cache..  
24090 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
240a0 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  Database changes
240b0 20 69 73 20 64 65 74 65 63 74 65 64 20 62 79 20   is detected by 
240c0 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79  looking at 15 by
240d0 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  tes beginning.  
240e0 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74      ** at offset
240f0 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c   24 into the fil
24100 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20  e.  The first 4 
24110 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65  of these 16 byte
24120 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61  s are.      ** a
24130 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20   32-bit counter 
24140 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e  that is incremen
24150 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68  ted with each ch
24160 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ange.  The.     
24170 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20   ** other bytes 
24180 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20  change randomly 
24190 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20 63  with each file c
241a0 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20  hange when.     
241b0 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69   ** a codec is i
241c0 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20  n use..      ** 
241d0 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
241e0 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79  is a vanishingly
241f0 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68   small chance th
24200 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c  at a change will
24210 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a   not be .      *
24220 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65  * detected.  The
24230 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e   chance of an un
24240 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20  detected change 
24250 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74  is so small that
24260 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e  .      ** it can
24270 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20   be neglected.. 
24280 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 68       */.      ch
24290 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69  ar dbFileVers[si
242a0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
242b0 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20 20 20  ileVers)];.     
242c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
242d0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30  ecount(pPager, 0
242e0 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50  );..      if( pP
242f0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
24300 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 50  .        rc = pP
24310 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
24320 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
24330 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
24340 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
24350 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29  r->dbSizeValid )
24360 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
24370 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a  er->dbSize>0 ){.
24380 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
24390 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e  ("CKVERS %p %d\n
243a0 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f  ", pPager, sizeo
243b0 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b  f(dbFileVers)));
243c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
243d0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
243e0 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56  er->fd, &dbFileV
243f0 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
24400 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20  leVers), 24);.  
24410 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
24420 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
24430 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
24440 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24450 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
24460 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65   memset(dbFileVe
24470 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62  rs, 0, sizeof(db
24480 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
24490 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d    }..      if( m
244a0 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62  emcmp(pPager->db
244b0 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65  FileVers, dbFile
244c0 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
244d0 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a  ileVers))!=0 ){.
244e0 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
244f0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
24500 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
24510 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
24520 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20  xclusiveMode || 
24530 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
24540 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
24550 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69   }.. failed:.  i
24560 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
24570 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72   ){.    /* pager
24580 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e  _unlock() is a n
24590 6f 2d 6f 70 20 66 6f 72 20 65 78 63 6c 75 73 69  o-op for exclusi
245a0 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 6e 2d 6d  ve mode and in-m
245b0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e  emory databases.
245c0 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 75 6e   */.    pager_un
245d0 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
245e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
245f0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ../*.** If the r
24600 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68  eference count h
24610 61 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c  as reached zero,
24620 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   rollback any ac
24630 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
24640 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ion and unlock t
24650 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  he pager..**.** 
24660 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69  Except, in locki
24670 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56  ng_mode=EXCLUSIV
24680 45 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  E when there is 
24690 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a  nothing to in.**
246a0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
246b0 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63  urnal, the unloc
246c0 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d  k is not perform
246d0 65 64 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a  ed and there is.
246e0 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f  ** nothing to ro
246f0 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20  llback, so this 
24700 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
24710 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  op..*/ .static v
24720 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  oid pagerUnlockI
24730 66 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70  fUnused(Pager *p
24740 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 28 73  Pager){.  if( (s
24750 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
24760 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
24770 61 63 68 65 29 3d 3d 30 29 0a 20 20 20 26 26 20  ache)==0).   && 
24780 28 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  (!pPager->exclus
24790 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65  iveMode || pPage
247a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29  r->journalOff>0)
247b0 20 0a 20 20 29 7b 0a 20 20 20 20 70 61 67 65 72   .  ){.    pager
247c0 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
247d0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d  k(pPager);.  }.}
247e0 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
247f0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
24800 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20  age number pgno 
24810 69 6e 20 70 61 67 65 72 20 70 50 61 67 65 72 20  in pager pPager 
24820 28 61 20 70 61 67 65 0a 2a 2a 20 72 65 66 65 72  (a page.** refer
24830 65 6e 63 65 20 68 61 73 20 74 79 70 65 20 44 62  ence has type Db
24840 50 61 67 65 2a 29 2e 20 49 66 20 74 68 65 20 72  Page*). If the r
24850 65 71 75 65 73 74 65 64 20 72 65 66 65 72 65 6e  equested referen
24860 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73  ce is .** succes
24870 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c  sfully obtained,
24880 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f   it is copied to
24890 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c   *ppPage and SQL
248a0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
248b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
248c0 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
248d0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
248e0 61 63 68 65 2c 20 69 74 20 69 73 20 72 65 74 75  ache, it is retu
248f0 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  rned. .** Otherw
24900 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20  ise, a new page 
24910 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61  object is alloca
24920 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ted and populate
24930 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72  d with data.** r
24940 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
24950 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73  abase file. In s
24960 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 70  ome cases, the p
24970 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79  cache module may
24980 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74  .** choose not t
24990 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
249a0 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64   page object and
249b0 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65 78   may reuse an ex
249c0 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74  isting.** object
249d0 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e   with no outstan
249e0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e  ding references.
249f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61  .**.** The extra
24a00 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
24a10 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
24a20 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  ys initialized t
24a30 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20  o zeros the .** 
24a40 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67  first time a pag
24a50 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f  e is loaded into
24a60 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20   memory. If the 
24a70 70 61 67 65 20 72 65 71 75 65 73 74 65 64 20 69  page requested i
24a80 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  s .** already in
24a90 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
24aa0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
24ab0 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68   called, then th
24ac0 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20  e extra.** data 
24ad0 69 73 20 6c 65 66 74 20 61 73 20 69 74 20 77 61  is left as it wa
24ae0 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20  s when the page 
24af0 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20  object was last 
24b00 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  used..**.** If t
24b10 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
24b20 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  e is smaller tha
24b30 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
24b40 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a  page or if a .**
24b50 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
24b60 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  is passed as the
24b70 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d   noContent param
24b80 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a  eter and the .**
24b90 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
24ba0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73  is not already s
24bb0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61 63  tored in the cac
24bc0 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20  he, then no .** 
24bd0 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64  actual disk read
24be0 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73   occurs. In this
24bf0 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79   case the memory
24c00 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a   image of the .*
24c10 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61  * page is initia
24c20 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72  lized to all zer
24c30 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  os. .**.** If no
24c40 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c  Content is true,
24c50 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
24c60 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
24c70 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  out the contents
24c80 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e  .** of the page.
24c90 20 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20   This occurs in 
24ca0 74 77 6f 20 73 65 70 65 72 61 74 65 20 73 63 65  two seperate sce
24cb0 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  narios:.**.**   
24cc0 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20  a) When reading 
24cd0 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
24ce0 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
24cf0 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a  atabase, and.**.
24d00 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20 73  **   b) When a s
24d10 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e  avepoint is bein
24d20 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  g rolled back an
24d30 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61  d we need to loa
24d40 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20  d.**      a new 
24d50 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61  page into the ca
24d60 63 68 65 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  che to populate 
24d70 77 69 74 68 20 74 68 65 20 64 61 74 61 20 72 65  with the data re
24d80 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ad.**      from 
24d90 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f  the savepoint jo
24da0 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
24db0 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
24dc0 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  e, then the data
24dd0 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72   returned is zer
24de0 6f 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  oed instead of.*
24df0 2a 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f  * being read fro
24e00 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
24e10 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68  Additionally, th
24e20 65 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e  e bits correspon
24e30 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20  ding.** to pgno 
24e40 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  in Pager.pInJour
24e50 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70  nal (bitvec of p
24e60 61 67 65 73 20 61 6c 72 65 61 64 79 20 77 72 69  ages already wri
24e70 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a  tten to the.** j
24e80 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64  ournal file) and
24e90 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
24ea0 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
24eb0 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20   bitvecs of any 
24ec0 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  open.** savepoin
24ed0 74 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73  ts are set. This
24ee0 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70 61   means if the pa
24ef0 67 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61  ge is made writa
24f00 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f  ble at any.** po
24f10 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
24f20 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20  e, using a call 
24f30 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
24f40 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74  rite(), its cont
24f50 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ents.** will not
24f60 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54   be journaled. T
24f70 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a  his saves IO..**
24f80 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74  .** The acquisit
24f90 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66  ion might fail f
24fa0 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f  or several reaso
24fb0 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65  ns.  In all case
24fc0 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72  s,.** an appropr
24fd0 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
24fe0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
24ff0 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
25000 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  o NULL..**.** Se
25010 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
25020 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f  gerLookup().  Bo
25030 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  th this routine 
25040 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74  and Lookup() att
25050 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
25060 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
25070 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
25080 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
25090 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
250a0 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
250b0 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
250c0 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
250d0 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c   it in whereas L
250e0 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
250f0 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
25100 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
25110 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
25120 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
25130 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
25140 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
25150 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
25160 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
25170 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
25180 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76  nce Lookup() nev
25190 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c  er goes to disk,
251a0 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f   it never has to
251b0 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73   deal with locks
251c0 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  .** or journal f
251d0 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iles..*/.int sql
251e0 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
251f0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
25200 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  r,      /* The p
25210 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ager open on the
25220 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
25230 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
25240 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
25250 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20  number to fetch 
25260 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70  */.  DbPage **pp
25270 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74  Page,    /* Writ
25280 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
25290 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  he page here */.
252a0 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20    int noContent 
252b0 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
252c0 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20 63  bother reading c
252d0 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b  ontent from disk
252e0 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
252f0 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
25300 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74   *pPg;..  assert
25310 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
25320 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
25330 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
25340 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 55 4e  ->state>PAGER_UN
25350 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70  LOCK );..  if( p
25360 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  gno==0 ){.    re
25370 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
25380 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
25390 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
253a0 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
253b0 20 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20 61   state, return a
253c0 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64 69 61 74  n error immediat
253d0 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72  ely. .  ** Other
253e0 77 69 73 65 2c 20 72 65 71 75 65 73 74 20 74 68  wise, request th
253f0 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
25400 50 43 61 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f  PCache layer. */
25410 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
25420 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f  rrCode!=SQLITE_O
25430 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  K && pPager->err
25440 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
25450 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  L ){.    rc = pP
25460 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
25470 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
25480 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
25490 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
254a0 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 70 70  che, pgno, 1, pp
254b0 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Page);.  }..  if
254c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
254d0 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72  ){.    /* Either
254e0 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
254f0 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
25500 29 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72  ) returned an er
25510 72 6f 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ror or the.    *
25520 2a 20 70 61 67 65 72 20 77 61 73 20 61 6c 72 65  * pager was alre
25530 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72  ady in the error
25540 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73  -state when this
25550 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
25560 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74  lled..    ** Set
25570 20 70 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75   pPg to 0 and ju
25580 6d 70 20 74 6f 20 74 68 65 20 65 78 63 65 70 74  mp to the except
25590 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f  ion handler.  */
255a0 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20  .    pPg = 0;.  
255b0 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
255c0 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20  uire_err;.  }.  
255d0 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65  assert( (*ppPage
255e0 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b  )->pgno==pgno );
255f0 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50  .  assert( (*ppP
25600 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 70 50  age)->pPager==pP
25610 61 67 65 72 20 7c 7c 20 28 2a 70 70 50 61 67 65  ager || (*ppPage
25620 29 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a  )->pPager==0 );.
25630 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67 65 29  .  if( (*ppPage)
25640 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20  ->pPager ){.    
25650 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  /* In this case 
25660 74 68 65 20 70 63 61 63 68 65 20 61 6c 72 65 61  the pcache alrea
25670 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69  dy contains an i
25680 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79 20  nitialized copy 
25690 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  of.    ** the pa
256a0 67 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  ge. Return witho
256b0 75 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e 20  ut further ado. 
256c0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
256d0 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f  pgno<=PAGER_MAX_
256e0 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41  PGNO && pgno!=PA
256f0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
25700 65 72 29 20 29 3b 0a 20 20 20 20 50 41 47 45 52  er) );.    PAGER
25710 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48  _INCR(pPager->nH
25720 69 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  it);.    return 
25730 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65  SQLITE_OK;..  }e
25740 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
25750 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73 20  pager cache has 
25760 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70 61  created a new pa
25770 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20  ge. Its content 
25780 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a  needs to .    **
25790 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
257a0 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61    */.    int nMa
257b0 78 3b 0a 0a 20 20 20 20 50 41 47 45 52 5f 49 4e  x;..    PAGER_IN
257c0 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73  CR(pPager->nMiss
257d0 29 3b 0a 20 20 20 20 70 50 67 20 3d 20 2a 70 70  );.    pPg = *pp
257e0 50 61 67 65 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Page;.    pPg->p
257f0 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
25800 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69  .    /* The maxi
25810 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20  mum page number 
25820 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20  is 2^31. Return 
25830 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
25840 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  f a page.    ** 
25850 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
25860 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74 68 65  han this, or the
25870 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d   unused locking-
25880 70 61 67 65 2c 20 69 73 20 72 65 71 75 65 73 74  page, is request
25890 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
258a0 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47  gno>PAGER_MAX_PG
258b0 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  NO || pgno==PAGE
258c0 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
258d0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
258e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
258f0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
25900 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
25910 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  r;.    }..    rc
25920 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
25930 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
25940 20 26 6e 4d 61 78 29 3b 0a 20 20 20 20 69 66 28   &nMax);.    if(
25950 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
25960 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
25970 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
25980 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6e      }..    if( n
25990 4d 61 78 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c  Max<(int)pgno ||
259a0 20 4d 45 4d 44 42 20 7c 7c 20 6e 6f 43 6f 6e 74   MEMDB || noCont
259b0 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ent ){.      if(
259c0 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78   pgno>pPager->mx
259d0 50 67 6e 6f 20 29 7b 0a 09 72 63 20 3d 20 53 51  Pgno ){..rc = SQ
259e0 4c 49 54 45 5f 46 55 4c 4c 3b 0a 09 67 6f 74 6f  LITE_FULL;..goto
259f0 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
25a00 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
25a10 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20    if( noContent 
25a20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61  ){.        /* Fa
25a30 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68 65  ilure to set the
25a40 20 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a   bits in the InJ
25a50 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f  ournal bit-vecto
25a60 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20  rs is benign..  
25a70 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65        ** It mere
25a80 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  ly means that we
25a90 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65   might do some e
25aa0 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75  xtra work to jou
25ab0 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20  rnal a .        
25ac0 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f 65  ** page that doe
25ad0 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
25ae0 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76   journaled.  Nev
25af0 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75  ertheless, be su
25b00 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  re .        ** t
25b10 6f 20 74 65 73 74 20 74 68 65 20 63 61 73 65 20  o test the case 
25b20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65  where a malloc e
25b30 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
25b40 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20  e trying to set 
25b50 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69  .        ** a bi
25b60 74 20 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f  t in a bit vecto
25b70 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  r..        */.  
25b80 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
25b90 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
25ba0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 41 4c  ;.        if( AL
25bb0 57 41 59 53 28 70 67 6e 6f 3c 3d 70 50 61 67 65  WAYS(pgno<=pPage
25bc0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29 20 29  r->dbOrigSize) )
25bd0 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45 53 54  {.          TEST
25be0 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c  ONLY( rc = ) sql
25bf0 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
25c00 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
25c10 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
25c20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
25c30 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
25c40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25c50 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20     TESTONLY( rc 
25c60 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69  = ) addToSavepoi
25c70 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
25c80 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
25c90 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
25ca0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
25cb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
25cc0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
25cd0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
25ce0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67        memset(pPg
25cf0 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->pData, 0, pPag
25d00 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
25d10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 49 4f 54       }.      IOT
25d20 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25  RACE(("ZERO %p %
25d30 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
25d40 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  no));.    }else{
25d50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
25d60 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
25d70 65 72 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  er );.      rc =
25d80 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29   readDbPage(pPg)
25d90 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
25da0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25db0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
25dc0 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
25dd0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65     }.    }.#ifde
25de0 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
25df0 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
25e00 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
25e10 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
25e20 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ndif.  }..  retu
25e30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
25e40 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
25e50 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  :.  assert( rc!=
25e60 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
25e70 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71  f( pPg ){.    sq
25e80 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
25e90 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  pPg);.  }.  page
25ea0 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
25eb0 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50  pPager);..  *ppP
25ec0 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  age = 0;.  retur
25ed0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
25ee0 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
25ef0 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
25f00 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
25f10 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
25f20 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
25f30 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
25f40 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
25f50 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
25f60 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
25f70 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 41   not in cache. A
25f80 6c 73 6f 2c 20 72 65 74 75 72 6e 20 30 20 69 66  lso, return 0 if
25f90 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 72 20 69   the .** pager i
25fa0 73 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43  s in PAGER_UNLOC
25fb0 4b 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  K state when thi
25fc0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
25fd0 6c 6c 65 64 2c 0a 2a 2a 20 6f 72 20 69 66 20 74  lled,.** or if t
25fe0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 61  he pager is in a
25ff0 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74  n error state ot
26000 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
26010 46 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  FULL..**.** See 
26020 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
26030 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66  rGet().  The dif
26040 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
26050 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
26060 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
26070 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67  Get() is that _g
26080 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20  et() will go to 
26090 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61  the disk and rea
260a0 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65  d.** in the page
260b0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
260c0 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63  not already in c
260d0 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
260e0 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e  ine.** returns N
260f0 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20  ULL if the page 
26100 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
26110 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f  or if a disk I/O
26120 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65   error .** has e
26130 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f  ver happened..*/
26140 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33  .DbPage *sqlite3
26150 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65  PagerLookup(Page
26160 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
26170 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
26180 70 50 67 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  pPg = 0;.  asser
26190 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
261a0 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
261b0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
261c0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d  Pager->pPCache!=
261d0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
261e0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3e 20 50  Pager->state > P
261f0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
26200 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
26210 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
26220 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70  che, pgno, 0, &p
26230 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  Pg);.  return pP
26240 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  g;.}../*.** Rele
26250 61 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72  ase a page refer
26260 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ence..**.** If t
26270 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
26280 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
26290 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f  age drop to zero
262a0 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61  , then the.** pa
262b0 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ge is added to t
262c0 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68  he LRU list.  Wh
262d0 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  en all reference
262e0 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a  s to all pages.*
262f0 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20  * are released, 
26300 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
26310 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  s and the lock o
26320 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
26330 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f  s.** removed..*/
26340 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
26350 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a  erUnref(DbPage *
26360 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20  pPg){.  if( pPg 
26370 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50  ){.    Pager *pP
26380 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
26390 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  er;.    sqlite3P
263a0 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67  cacheRelease(pPg
263b0 29 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  );.    pagerUnlo
263c0 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
263d0 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
263e0 20 49 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   If the main jou
263f0 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 61 6c  rnal file has al
26400 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65  ready been opene
26410 64 2c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  d, ensure that t
26420 68 65 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61  he.** sub-journa
26430 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 74  l file is open t
26440 6f 6f 2e 20 49 66 20 74 68 65 20 6d 61 69 6e 20  oo. If the main 
26450 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 6f  journal is not o
26460 70 65 6e 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e  pen,.** this fun
26470 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
26480 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
26490 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
264a0 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73   everything goes
264b0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c   according to pl
264c0 61 6e 2e 20 0a 2a 2a 20 41 6e 20 53 51 4c 49 54  an. .** An SQLIT
264d0 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f  E_IOERR_XXX erro
264e0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
264f0 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20  ed if a call to 
26500 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  .** sqlite3OsOpe
26510 6e 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  n() fails..*/.st
26520 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62  atic int openSub
26530 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
26540 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
26550 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
26560 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
26570 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70  r->jfd) && !isOp
26580 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
26590 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
265a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
265b0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
265c0 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61  DE_MEMORY || pPa
265d0 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72  ger->subjInMemor
265e0 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  y ){.      sqlit
265f0 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e  e3MemJournalOpen
26600 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
26610 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26620 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74   rc = pagerOpent
26630 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67  emp(pPager, pPag
26640 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54 45  er->sjfd, SQLITE
26650 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
26660 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
26670 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
26680 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
26690 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68   is called at th
266a0 65 20 73 74 61 72 74 20 6f 66 20 65 76 65 72 79  e start of every
266b0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
266c0 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  on..** There mus
266d0 74 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52  t already be a R
266e0 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
266f0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
26700 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
26710 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
26720 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
26730 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a  **.** Open the j
26740 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
26750 70 61 67 65 72 20 70 50 61 67 65 72 20 61 6e 64  pager pPager and
26760 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c   write a journal
26770 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68   header.** to th
26780 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49  e start of it. I
26790 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
267a0 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f  ve savepoints, o
267b0 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  pen the sub-jour
267c0 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20  nal.** as well. 
267d0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
267e0 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20   only used when 
267f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
26800 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70   is being .** op
26810 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61 20  ened to write a 
26820 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72  rollback log for
26830 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
26840 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a  It is not used .
26850 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  ** when opening 
26860 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69  a hot journal fi
26870 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  le to roll it ba
26880 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
26890 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
268a0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61   already open (a
268b0 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65  s it may be in e
268c0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a  xclusive mode),.
268d0 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  ** then this fun
268e0 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65  ction just write
268f0 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  s a journal head
26900 65 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  er to the start 
26910 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64  of the.** alread
26920 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a  y open file. .**
26930 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e  .** Whether or n
26940 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ot the journal f
26950 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79  ile is opened by
26960 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
26970 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e  the.** Pager.pIn
26980 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73  Journal bitvec s
26990 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
269a0 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  cated..**.** Ret
269b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
269c0 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
269d0 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72  uccessful. Other
269e0 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  wise, return .**
269f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
26a00 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
26a10 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70  allocate Pager.p
26a20 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c  InJournal fails,
26a30 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72   or .** an IO er
26a40 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e  ror code if open
26a50 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
26a60 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
26a70 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
26a80 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f   int pager_open_
26a90 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  journal(Pager *p
26aa0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
26ab0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
26ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ad0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
26ae0 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
26af0 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
26b00 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
26b10 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63  ;   /* Local cac
26b20 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65  he of vfs pointe
26b30 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
26b40 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
26b50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
26b60 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
26b70 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
26b80 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
26b90 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
26ba0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
26bb0 45 5f 4f 46 46 20 29 3b 0a 20 20 61 73 73 65 72  E_OFF );.  asser
26bc0 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
26bd0 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20  urnal==0 );.  . 
26be0 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69   /* If already i
26bf0 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
26c00 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
26c10 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75   is a no-op.  Bu
26c20 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74  t on.  ** the ot
26c30 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20 72  her hand, this r
26c40 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
26c50 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72 65  called if we are
26c60 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a   already in.  **
26c70 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2e   an error state.
26c80 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
26c90 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
26ca0 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72   ) return pPager
26cb0 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a  ->errCode;..  /*
26cc0 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 72 65 61   TODO: Is it rea
26cd0 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  lly possible to 
26ce0 67 65 74 20 68 65 72 65 20 77 69 74 68 20 64 62  get here with db
26cf0 53 69 7a 65 56 61 6c 69 64 3d 3d 30 3f 20 49 66  SizeValid==0? If
26d00 20 6e 6f 74 2c 0a 20 20 2a 2a 20 74 68 65 20 63   not,.  ** the c
26d10 61 6c 6c 20 74 6f 20 50 61 67 65 72 50 61 67 65  all to PagerPage
26d20 63 6f 75 6e 74 28 29 20 63 61 6e 20 62 65 20 72  count() can be r
26d30 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 74  emoved..  */.  t
26d40 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d  estcase( pPager-
26d50 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20  >dbSizeValid==0 
26d60 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
26d70 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
26d80 72 2c 20 30 29 3b 0a 0a 20 20 70 50 61 67 65 72  r, 0);..  pPager
26d90 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  ->pInJournal = s
26da0 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
26db0 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  te(pPager->dbSiz
26dc0 65 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  e);.  if( pPager
26dd0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
26de0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
26df0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
26e00 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a  .  /* Open the j
26e10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69  ournal file if i
26e20 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
26e30 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 69 66 28 20   open. */.  if( 
26e40 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
26e50 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20  jfd) ){.    if( 
26e60 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
26e70 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
26e80 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b  ALMODE_MEMORY ){
26e90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65  .      sqlite3Me
26ea0 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61  mJournalOpen(pPa
26eb0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
26ec0 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73  else{.      cons
26ed0 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 20  t int flags =   
26ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ef0 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 74 6f 20  /* VFS flags to 
26f00 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
26f10 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  e */.        SQL
26f20 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
26f30 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
26f40 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 28  REATE|.        (
26f50 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
26f60 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20 28 53   ? .          (S
26f70 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
26f80 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f  EONCLOSE|SQLITE_
26f90 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
26fa0 4c 29 3a 0a 20 20 20 20 20 20 20 20 20 20 28 53  L):.          (S
26fb0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
26fc0 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20 20 20  JOURNAL).       
26fd0 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
26fe0 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
26ff0 57 52 49 54 45 0a 20 20 20 20 20 20 72 63 20 3d  WRITE.      rc =
27000 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f   sqlite3JournalO
27010 70 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20 70  pen(.          p
27020 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
27030 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
27040 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42  fd, flags, jrnlB
27050 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
27060 29 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65  ).      );.#else
27070 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
27080 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
27090 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
270a0 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
270b0 6c 61 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66  lags, 0);.#endif
270c0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
270d0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
270e0 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
270f0 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 7d 0a 0a  r->jfd) );.  }..
27100 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
27110 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
27120 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72  ader to the jour
27130 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65  nal file and ope
27140 6e 20 0a 20 20 2a 2a 20 74 68 65 20 73 75 62 2d  n .  ** the sub-
27150 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
27160 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sary..  */.  if(
27170 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
27180 7b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43  {.    /* TODO: C
27190 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74  heck if all of t
271a0 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20  hese are really 
271b0 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
271c0 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
271d0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
271e0 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 72  Size;.    pPager
271f0 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
27200 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
27210 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
27220 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
27230 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
27240 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
27250 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  ;.    pPager->se
27260 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  tMaster = 0;.   
27270 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
27280 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  Hdr = 0;.    rc 
27290 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
272a0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  r(pPager);.  }. 
272b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
272c0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 53  OK && pPager->nS
272d0 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
272e0 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72  rc = openSubJour
272f0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  nal(pPager);.  }
27300 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
27310 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
27320 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
27330 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
27340 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65  rnal);.    pPage
27350 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
27360 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
27370 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  rc;.}../*.** Beg
27380 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  in a write-trans
27390 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70  action on the sp
273a0 65 63 69 66 69 65 64 20 70 61 67 65 72 20 6f 62  ecified pager ob
273b0 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77  ject. If a .** w
273c0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
273d0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
273e0 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66  n opened, this f
273f0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
27400 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
27410 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74   exFlag argument
27420 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
27430 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74  acquire at least
27440 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c   a RESERVED.** l
27450 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
27460 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46  ase file. If exF
27470 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
27480 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61  n acquire at lea
27490 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49  st.** an EXCLUSI
274a0 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68  VE lock. If such
274b0 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61   a lock is alrea
274c0 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b  dy held, no lock
274d0 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ing .** function
274e0 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64  s need be called
274f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
27500 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61  is not a tempora
27510 72 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20  ry or in-memory 
27520 66 69 6c 65 20 61 6e 64 2c 20 74 68 65 20 6a 6f  file and, the jo
27530 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 2a  urnal file is .*
27540 2a 20 6f 70 65 6e 65 64 20 69 66 20 69 74 20 68  * opened if it h
27550 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 72 65  as not been alre
27560 61 64 79 2e 20 46 6f 72 20 61 20 74 65 6d 70 6f  ady. For a tempo
27570 72 61 72 79 20 66 69 6c 65 2c 20 74 68 65 20 6f  rary file, the o
27580 70 65 6e 69 6e 67 20 0a 2a 2a 20 6f 66 20 74 68  pening .** of th
27590 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
275a0 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
275b0 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 63 74   there is an act
275c0 75 61 6c 20 6e 65 65 64 20 74 6f 20 0a 2a 2a 20  ual need to .** 
275d0 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
275e0 72 6e 61 6c 2e 20 54 4f 44 4f 3a 20 57 68 79 20  rnal. TODO: Why 
275f0 68 61 6e 64 6c 65 20 74 65 6d 70 6f 72 61 72 79  handle temporary
27600 20 66 69 6c 65 73 20 64 69 66 66 65 72 65 6e 74   files different
27610 6c 79 3f 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ly?.**.** If the
27620 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
27630 20 6f 70 65 6e 65 64 20 28 6f 72 20 69 66 20 69   opened (or if i
27640 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  t is already ope
27650 6e 29 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 6a 6f  n), then a.** jo
27660 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20  urnal-header is 
27670 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73  written to the s
27680 74 61 72 74 20 6f 66 20 69 74 2e 0a 2a 2a 0a 2a  tart of it..**.*
27690 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d  * If the subjInM
276a0 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69  emory argument i
276b0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
276c0 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   any sub-journal
276d0 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69   opened.** withi
276e0 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
276f0 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  on will be opene
27700 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  d as an in-memor
27710 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20  y file. This.** 
27720 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69 66  has no effect if
27730 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
27740 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
27750 65 64 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  ed (as it may be
27760 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67   when.** running
27770 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
27780 64 65 29 20 6f 72 20 69 66 20 74 68 65 20 74 72  de) or if the tr
27790 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e  ansaction does n
277a0 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a 20  ot require a.** 
277b0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  sub-journal. If 
277c0 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  the subjInMemory
277d0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65 72   argument is zer
277e0 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75  o, then any requ
277f0 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  ired.** sub-jour
27800 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  nal is implement
27810 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20  ed in-memory if 
27820 70 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e 2d  pPager is an in-
27830 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
27840 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61 20   .** or using a 
27850 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f  temporary file o
27860 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74  therwise..*/.int
27870 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
27880 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
27890 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e  , int exFlag, in
278a0 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b  t subjInMemory){
278b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
278c0 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
278d0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
278e0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
278f0 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e    pPager->subjIn
27900 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75 62  Memory = (u8)sub
27910 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 20 20 69 66 28  jInMemory;.  if(
27920 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
27930 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a  PAGER_SHARED ){.
27940 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
27950 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
27960 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
27970 20 21 4d 45 4d 44 42 20 26 26 20 21 70 50 61 67   !MEMDB && !pPag
27980 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
27990 0a 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61  .    /* Obtain a
279a0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
279b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
279c0 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c  ile. If the exFl
279d0 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20  ag parameter.   
279e0 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65   ** is true, the
279f0 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70  n immediately up
27a00 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e  grade this to an
27a10 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
27a20 20 54 68 65 0a 20 20 20 20 2a 2a 20 62 75 73 79   The.    ** busy
27a30 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
27a40 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68  k can be used wh
27a50 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f 20  en upgrading to 
27a60 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a 20 20  the EXCLUSIVE.  
27a70 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e    ** lock, but n
27a80 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e  ot when obtainin
27a90 67 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  g the RESERVED l
27aa0 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ock..    */.    
27ab0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
27ac0 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52  ck(pPager->fd, R
27ad0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20  ESERVED_LOCK);. 
27ae0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
27af0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
27b00 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
27b10 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20  GER_RESERVED;.  
27b20 20 20 20 20 69 66 28 20 65 78 46 6c 61 67 20 29      if( exFlag )
27b30 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
27b40 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
27b50 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
27b60 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
27b70 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
27b80 20 49 66 20 74 68 65 20 72 65 71 75 69 72 65 64   If the required
27b90 20 6c 6f 63 6b 73 20 77 65 72 65 20 73 75 63 63   locks were succ
27ba0 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65  essfully obtaine
27bb0 64 2c 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  d, open the jour
27bc0 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
27bd0 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 66 69  and write the fi
27be0 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
27bf0 65 72 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f  er to it..    */
27c00 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
27c10 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
27c20 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
27c30 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
27c40 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 72 63  _OFF ){.      rc
27c50 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
27c60 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
27c70 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
27c80 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
27c90 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e  jfd) && pPager->
27ca0 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
27cb0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70  .    /* This hap
27cc0 70 65 6e 73 20 77 68 65 6e 20 74 68 65 20 70 61  pens when the pa
27cd0 67 65 72 20 77 61 73 20 69 6e 20 65 78 63 6c 75  ger was in exclu
27ce0 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
27cf0 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a   the last.    **
27d00 20 74 69 6d 65 20 61 20 28 72 65 61 64 20 6f 72   time a (read or
27d10 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74   write) transact
27d20 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66  ion was successf
27d30 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20  ully concluded. 
27d40 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f     ** by this co
27d50 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61  nnection. Instea
27d60 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68  d of deleting th
27d70 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
27d80 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65  t was .    ** ke
27d90 70 74 20 6f 70 65 6e 20 61 6e 64 20 65 69 74 68  pt open and eith
27da0 65 72 20 77 61 73 20 74 72 75 6e 63 61 74 65 64  er was truncated
27db0 20 74 6f 20 30 20 62 79 74 65 73 20 6f 72 20 69   to 0 bytes or i
27dc0 74 73 20 68 65 61 64 65 72 20 77 61 73 0a 20 20  ts header was.  
27dd0 20 20 2a 2a 20 6f 76 65 72 77 72 69 74 74 65 6e    ** overwritten
27de0 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20   with zeros..   
27df0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
27e00 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20  pPager->nRec==0 
27e10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
27e20 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
27e30 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e==0 );.    asse
27e40 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
27e50 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
27e60 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
27e70 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
27e80 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
27e90 41 43 45 28 28 22 54 52 41 4e 53 41 43 54 49 4f  ACE(("TRANSACTIO
27ea0 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  N %d\n", PAGERID
27eb0 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 61 73  (pPager)));.  as
27ec0 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
27ed0 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50  ager->jfd) || pP
27ee0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
27ef0 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45  >0 || rc!=SQLITE
27f00 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 72 63 21  _OK );.  if( rc!
27f10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27f20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
27f30 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 3b  r->dbModified );
27f40 0a 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 61  .    /* Ignore a
27f50 6e 79 20 49 4f 20 65 72 72 6f 72 20 74 68 61 74  ny IO error that
27f60 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 70   occurs within p
27f70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
27f80 74 69 6f 6e 28 29 2e 20 54 68 65 0a 20 20 20 20  tion(). The.    
27f90 2a 2a 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68  ** purpose of th
27fa0 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 72 65  is call is to re
27fb0 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  set the internal
27fc0 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
27fd0 67 65 72 0a 20 20 20 20 2a 2a 20 73 75 62 2d 73  ger.    ** sub-s
27fe0 79 73 74 65 6d 2e 20 49 74 20 64 6f 65 73 6e 27  ystem. It doesn'
27ff0 74 20 6d 61 74 74 65 72 20 69 66 20 74 68 65 20  t matter if the 
28000 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20  journal-file is 
28010 6e 6f 74 20 70 72 6f 70 65 72 6c 79 0a 20 20 20  not properly.   
28020 20 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 20 61 74   ** finalized at
28030 20 74 68 69 73 20 70 6f 69 6e 74 20 28 73 69 6e   this point (sin
28040 63 65 20 69 74 20 69 73 20 6e 6f 74 20 61 20 76  ce it is not a v
28050 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  alid journal fil
28060 65 20 61 6e 79 77 61 79 29 2e 0a 20 20 20 20 2a  e anyway)..    *
28070 2f 0a 20 20 20 20 70 61 67 65 72 5f 65 6e 64 5f  /.    pager_end_
28080 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
28090 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  er, 0);.  }.  re
280a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
280b0 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20  * Mark a single 
280c0 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
280d0 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65  teable. The page
280e0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
280f0 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f   the .** main jo
28100 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75  urnal or sub-jou
28110 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65 64  rnal as required
28120 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
28130 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
28140 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72   one of the jour
28150 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73  nals, the corres
28160 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73  ponding bit is s
28170 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61  et in the .** Pa
28180 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62  ger.pInJournal b
28190 69 74 76 65 63 20 61 6e 64 20 74 68 65 20 50 61  itvec and the Pa
281a0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e  gerSavepoint.pIn
281b0 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63  Savepoint bitvec
281c0 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e  s.** of any open
281d0 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61   savepoints as a
281e0 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73  ppropriate..*/.s
281f0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
28200 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67  write(PgHdr *pPg
28210 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61  ){.  void *pData
28220 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20   = pPg->pData;. 
28230 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
28240 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
28250 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
28260 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20  OK;..  /* If an 
28270 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70  error has been p
28280 72 65 76 69 6f 75 73 6c 79 20 64 65 74 65 63 74  reviously detect
28290 65 64 2c 20 77 65 20 73 68 6f 75 6c 64 20 6e 6f  ed, we should no
282a0 74 20 62 65 0a 20 20 2a 2a 20 63 61 6c 6c 69 6e  t be.  ** callin
282b0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
282c0 20 52 65 70 65 61 74 20 74 68 65 20 65 72 72 6f   Repeat the erro
282d0 72 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  r for robustness
282e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ..  */.  if( NEV
282f0 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
28300 64 65 29 20 29 20 20 72 65 74 75 72 6e 20 70 50  de) )  return pP
28310 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a  ager->errCode;..
28320 20 20 2f 2a 20 48 69 67 68 65 72 2d 6c 65 76 65    /* Higher-leve
28330 6c 20 72 6f 75 74 69 6e 65 73 20 6e 65 76 65 72  l routines never
28340 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
28350 69 6f 6e 20 69 66 20 64 61 74 61 62 61 73 65 20  ion if database 
28360 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 77 72 69 74  is not.  ** writ
28370 61 62 6c 65 2e 20 20 42 75 74 20 63 68 65 63 6b  able.  But check
28380 20 61 6e 79 77 61 79 2c 20 6a 75 73 74 20 66 6f   anyway, just fo
28390 72 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f  r robustness. */
283a0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
283b0 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29  ger->readOnly) )
283c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
283d0 45 52 4d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ERM;..  assert( 
283e0 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74  !pPager->setMast
283f0 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50  er );..  CHECK_P
28400 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  AGE(pPg);..  /* 
28410 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
28420 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20   dirty.  If the 
28430 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79  page has already
28440 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20   been written.  
28450 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ** to the journa
28460 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65  l then we can re
28470 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e  turn right away.
28480 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50  .  */.  sqlite3P
28490 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70  cacheMakeDirty(p
284a0 50 67 29 3b 0a 20 20 69 66 28 20 70 61 67 65 49  Pg);.  if( pageI
284b0 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26  nJournal(pPg) &&
284c0 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61   !subjRequiresPa
284d0 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 70  ge(pPg) ){.    p
284e0 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
284f0 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d = 1;.  }else{.
28500 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65  .    /* If we ge
28510 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
28520 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
28530 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  ge needs to be. 
28540 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f     ** written to
28550 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
28560 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20   journal or the 
28570 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  ckeckpoint journ
28580 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74  al.    ** or bot
28590 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  h..    **.    **
285a0 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20   First check to 
285b0 73 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61  see that the tra
285c0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
285d0 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20   exists and.    
285e0 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20  ** create it if 
285f0 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20  it does not..   
28600 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
28610 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
28620 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
28630 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
28640 61 67 65 72 42 65 67 69 6e 28 70 50 61 67 65 72  agerBegin(pPager
28650 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 73 75 62  , 0, pPager->sub
28660 6a 49 6e 4d 65 6d 6f 72 79 29 3b 0a 20 20 20 20  jInMemory);.    
28670 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28680 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
28690 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
286a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
286b0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
286c0 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69 66 28  ERVED );.    if(
286d0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
286e0 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d  >jfd) && pPager-
286f0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
28700 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
28710 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 61 73 73  OFF ){.      ass
28720 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
28730 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20  Journal );.     
28740 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
28750 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
28760 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
28770 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
28780 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
28790 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
287a0 69 65 64 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20  ied = 1;.  .    
287b0 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
287c0 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65  on journal now e
287d0 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76  xists and we hav
287e0 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
287f0 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
28800 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
28810 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
28820 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63  le.  Write the c
28830 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20  urrent page to. 
28840 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61     ** the transa
28850 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66  ction journal if
28860 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
28870 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
28880 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 49 6e  .    if( !pageIn
28890 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20  Journal(pPg) && 
288a0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
288b0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  fd) ){.      if(
288c0 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67   pPg->pgno<=pPag
288d0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
288e0 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6b  {.        u32 ck
288f0 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61  sum;.        cha
28900 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20 20  r *pData2;..    
28910 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64      /* We should
28920 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20   never write to 
28930 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
28940 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20   the page that. 
28950 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
28960 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
28970 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c  locks.  The foll
28980 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65 72  owing assert ver
28990 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  ifies.        **
289a0 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e   that we do not.
289b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
289c0 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50  rt( pPg->pgno!=P
289d0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
289e0 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ger) );.        
289f0 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
28a00 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
28a10 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54   7, return SQLIT
28a20 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29  E_NOMEM, pData2)
28a30 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20  ;.        cksum 
28a40 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  = pager_cksum(pP
28a50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61  ager, (u8*)pData
28a60 32 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  2);.        rc =
28a70 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
28a80 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
28a90 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50  ->journalOff, pP
28aa0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
28ab0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
28ac0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
28ad0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
28ae0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
28af0 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72  , pData2, pPager
28b00 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
28b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
28b30 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 20 34  ->journalOff + 4
28b40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
28b50 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
28b60 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
28b70 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20 20 7d  ize+4;.        }
28b80 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
28b90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28ba0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
28bb0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
28bc0 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
28bd0 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d 29  urnalOff, cksum)
28be0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
28bf0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
28c00 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 4;.        }. 
28c10 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
28c20 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64  "JOUT %p %d %lld
28c30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
28c40 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  pPg->pgno, .    
28c50 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
28c60 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
28c70 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
28c80 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  e));.        PAG
28c90 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
28ca0 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75  pager_writej_cou
28cb0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  nt);.        PAG
28cc0 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e 41  ERTRACE(("JOURNA
28cd0 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  L %d page %d nee
28ce0 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30  dSync=%d hash(%0
28cf0 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
28d00 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
28d10 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
28d20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28   .             (
28d30 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
28d40 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
28d50 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ), pager_pagehas
28d60 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20 20 20  h(pPg)));..     
28d70 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e     /* Even if an
28d80 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20   IO or diskfull 
28d90 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 77  error occurred w
28da0 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67  hile journalling
28db0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
28dc0 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c 6f 63  page in the bloc
28dd0 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74 68 65  k above, set the
28de0 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61 67 20   need-sync flag 
28df0 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 20 20  for the page..  
28e00 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69        ** Otherwi
28e10 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72 61  se, when the tra
28e20 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
28e30 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67  ed back, the log
28e40 69 63 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ic in.        **
28e50 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61   playback_one_pa
28e60 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20  ge() will think 
28e70 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
28e80 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72  eds to be restor
28e90 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  ed.        ** in
28ea0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
28eb0 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49 4f  le. And if an IO
28ec0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
28ed0 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20  ile doing so,.  
28ee0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 6f        ** then co
28ef0 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c  rruption may fol
28f00 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  low..        */.
28f10 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
28f20 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
28f30 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c           pPg->fl
28f40 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
28f50 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20  D_SYNC;.        
28f60 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
28f70 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
28f80 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  }..        /* An
28f90 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
28fa0 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74  red writing to t
28fb0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
28fc0 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   The .        **
28fd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
28fe0 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l be rolled back
28ff0 20 62 79 20 74 68 65 20 6c 61 79 65 72 20 61 62   by the layer ab
29000 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ove..        */.
29010 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
29020 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29030 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
29040 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
29050 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
29060 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  c++;.        ass
29070 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
29080 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
29090 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
290a0 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
290b0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
290c0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
290d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
290e0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
290f0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
29100 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29110 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
29120 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 72  MEM );.        r
29130 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70 6f  c |= addToSavepo
29140 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
29150 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  r, pPg->pgno);. 
29160 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
29170 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29180 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
29190 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
291a0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
291b0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
291c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
291d0 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
291e0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
291f0 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  d && !pPager->no
29200 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
29210 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
29220 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
29230 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
29240 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
29250 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29260 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
29270 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25  APPEND %d page %
29280 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
29290 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
292a0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
292b0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20  ), pPg->pgno,.  
292c0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70               ((p
292d0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
292e0 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29  NEED_SYNC)?1:0))
292f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
29300 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
29310 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
29320 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  nal is open and 
29330 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
29340 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68  in it,.    ** th
29350 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72  en write the cur
29360 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65  rent page to the
29370 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
29380 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20  al.  Note that. 
29390 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d     ** the statem
293a0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ent journal form
293b0 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  at differs from 
293c0 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75  the standard jou
293d0 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20  rnal format.    
293e0 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d  ** in that it om
293f0 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d  its the checksum
29400 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72  s and the header
29410 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
29420 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
29430 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 20 20  e(pPg) ){.      
29440 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
29450 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  age(pPg);.    }.
29460 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
29470 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
29480 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ze and return.. 
29490 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
294a0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
294b0 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69  ER_SHARED );.  i
294c0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
294d0 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20  e<pPg->pgno ){. 
294e0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
294f0 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  e = pPg->pgno;. 
29500 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
29510 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
29520 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
29530 74 65 61 62 6c 65 2e 20 54 68 69 73 20 72 6f 75  teable. This rou
29540 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c  tine must be cal
29550 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20 6d  led before .** m
29560 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f  aking changes to
29570 20 61 20 70 61 67 65 2e 20 54 68 65 20 63 61 6c   a page. The cal
29580 6c 65 72 20 6d 75 73 74 20 63 68 65 63 6b 20 74  ler must check t
29590 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
295a0 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66 75 6e 63  .** of this func
295b0 74 69 6f 6e 20 61 6e 64 20 62 65 20 63 61 72 65  tion and be care
295c0 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61 6e 67  ful not to chang
295d0 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20  e any page data 
295e0 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69 73 20  unless .** this 
295f0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
29600 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
29610 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
29620 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e  between this fun
29630 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f  ction and pager_
29640 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74 20  write() is that 
29650 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
29660 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68   also deals with
29670 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
29680 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72  e where 2 or mor
29690 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f  e pages.** fit o
296a0 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20  n a single disk 
296b0 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20  sector. In this 
296c0 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69  case all co-resi
296d0 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75  dent pages.** mu
296e0 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  st have been wri
296f0 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
29700 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20  nal file before 
29710 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
29720 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
29730 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  urs, SQLITE_NOME
29740 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  M or an IO error
29750 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
29760 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70 72 69  d.** as appropri
29770 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
29780 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
29790 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
297a0 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  ite(DbPage *pDbP
297b0 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
297c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50   SQLITE_OK;..  P
297d0 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50  gHdr *pPg = pDbP
297e0 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  age;.  Pager *pP
297f0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
29800 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65  er;.  Pgno nPage
29810 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61  PerSector = (pPa
29820 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f  ger->sectorSize/
29830 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
29840 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67 65 50  );..  if( nPageP
29850 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20  erSector>1 ){.  
29860 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e    Pgno nPageCoun
29870 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
29880 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
29890 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
298a0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e   file */.    Pgn
298b0 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20  o pg1;          
298c0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
298d0 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74  page of the sect
298e0 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65  or pPg is locate
298f0 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  d on. */.    int
29900 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
29910 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
29920 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74 69   of pages starti
29930 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75  ng at pg1 to jou
29940 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rnal */.    int 
29950 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
29960 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
29970 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  unter */.    int
29980 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 20   needSync = 0;  
29990 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
299a0 66 20 61 6e 79 20 70 61 67 65 20 68 61 73 20 50  f any page has P
299b0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 2a  GHDR_NEED_SYNC *
299c0 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  /..    /* Set th
299d0 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67  e doNotSync flag
299e0 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62   to 1. This is b
299f0 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74  ecause we cannot
29a00 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c   allow a journal
29a10 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74  .    ** header t
29a20 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 74  o be written bet
29a30 77 65 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a  ween the pages j
29a40 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68 69 73  ournaled by this
29a50 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a   function..    *
29a60 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  /.    assert( !M
29a70 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65  EMDB );.    asse
29a80 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
29a90 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  tSync==0 );.    
29aa0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
29ab0 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54  c = 1;..    /* T
29ac0 68 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65  his trick assume
29ad0 73 20 74 68 61 74 20 62 6f 74 68 20 74 68 65 20  s that both the 
29ae0 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
29af0 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20  ctor-size are.  
29b00 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20    ** an integer 
29b10 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73  power of 2. It s
29b20 65 74 73 20 76 61 72 69 61 62 6c 65 20 70 67 31  ets variable pg1
29b30 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69   to the identifi
29b40 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  er.    ** of the
29b50 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
29b60 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73  he sector pPg is
29b70 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20   located on..   
29b80 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28   */.    pg1 = ((
29b90 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e  pPg->pgno-1) & ~
29ba0 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d  (nPagePerSector-
29bb0 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 73 71  1)) + 1;..    sq
29bc0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
29bd0 75 6e 74 28 70 50 61 67 65 72 2c 20 28 69 6e 74  unt(pPager, (int
29be0 20 2a 29 26 6e 50 61 67 65 43 6f 75 6e 74 29 3b   *)&nPageCount);
29bf0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
29c00 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  no>nPageCount ){
29c10 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28  .      nPage = (
29c20 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29  pPg->pgno - pg1)
29c30 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  +1;.    }else if
29c40 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53  ( (pg1+nPagePerS
29c50 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f  ector-1)>nPageCo
29c60 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
29c70 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b  ge = nPageCount+
29c80 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65  1-pg1;.    }else
29c90 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
29ca0 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a  nPagePerSector;.
29cb0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
29cc0 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61  (nPage>0);.    a
29cd0 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e  ssert(pg1<=pPg->
29ce0 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  pgno);.    asser
29cf0 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50  t((pg1+nPage)>pP
29d00 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66  g->pgno);..    f
29d10 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
29d20 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
29d30 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  OK; ii++){.     
29d40 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69   Pgno pg = pg1+i
29d50 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  i;.      PgHdr *
29d60 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28  pPage;.      if(
29d70 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c   pg==pPg->pgno |
29d80 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63  | !sqlite3Bitvec
29d90 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
29da0 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a  Journal, pg) ){.
29db0 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d          if( pg!=
29dc0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
29dd0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
29de0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
29df0 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
29e00 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20  pg, &pPage);.   
29e10 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
29e20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29e30 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
29e40 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
29e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
29e60 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47   pPage->flags&PG
29e70 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b  HDR_NEED_SYNC ){
29e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
29e90 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
29ea0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
29eb0 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  t(pPager->needSy
29ec0 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nc);.           
29ed0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
29ee0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
29ef0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
29f00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
29f10 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
29f20 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f  pPage = pager_lo
29f30 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 29  okup(pPager, pg)
29f40 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
29f50 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73  if( pPage->flags
29f60 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
29f70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
29f80 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
29f90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
29fa0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
29fb0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pPage);.      }.
29fc0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
29fd0 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
29fe0 53 59 4e 43 20 66 6c 61 67 20 69 73 20 73 65 74  SYNC flag is set
29ff0 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20   for any of the 
2a000 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20 20 20  nPage pages .   
2a010 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20   ** starting at 
2a020 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65  pg1, then it nee
2a030 64 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72  ds to be set for
2a040 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65   all of them. Be
2a050 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69  cause.    ** wri
2a060 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74  ting to any of t
2a070 68 65 73 65 20 6e 50 61 67 65 20 70 61 67 65 73  hese nPage pages
2a080 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65 20   may damage the 
2a090 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20  others, the.    
2a0a0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
2a0b0 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e  must contain syn
2a0c0 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20  c()ed copies of 
2a0d0 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20  all of them.    
2a0e0 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66  ** before any of
2a0f0 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69   them can be wri
2a100 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20  tten out to the 
2a110 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
2a120 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
2a130 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
2a140 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
2a150 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
2a160 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  && pPager->noSyn
2a170 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f  c==0 );.      fo
2a180 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65  r(ii=0; ii<nPage
2a190 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
2a1a0 20 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20   PgHdr *pPage = 
2a1b0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
2a1c0 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20  ger, pg1+ii);.  
2a1d0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20        if( pPage 
2a1e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  ){.          pPa
2a1f0 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  ge->flags |= PGH
2a200 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20  DR_NEED_SYNC;.  
2a210 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
2a220 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
2a230 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2a240 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
2a250 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e  (pPager->needSyn
2a260 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  c);.    }..    a
2a270 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
2a280 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20  oNotSync==1 );. 
2a290 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
2a2a0 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Sync = 0;.  }els
2a2b0 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  e{.    rc = page
2a2c0 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65 29  r_write(pDbPage)
2a2d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2a2e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
2a2f0 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70  rn TRUE if the p
2a300 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65  age given in the
2a310 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72   argument was pr
2a320 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a  eviously passed.
2a330 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ** to sqlite3Pag
2a340 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f  erWrite().  In o
2a350 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75  ther words, retu
2a360 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
2a370 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65   ok.** to change
2a380 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
2a390 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  the page..*/.#if
2a3a0 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20  ndef NDEBUG.int 
2a3b0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2a3c0 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a  iteable(DbPage *
2a3d0 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pPg){.  return p
2a3e0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2a3f0 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a  DIRTY;.}.#endif.
2a400 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
2a410 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
2a420 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
2a430 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  at it is not nec
2a440 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69  essary to.** wri
2a450 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  te the informati
2a460 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62  on on page pPg b
2a470 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c  ack to the disk,
2a480 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20   even though.** 
2a490 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20  that page might 
2a4a0 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
2a4b0 74 79 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e  ty.  This happen
2a4c0 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s, for example, 
2a4d0 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  when.** the page
2a4e0 20 68 61 73 20 62 65 65 6e 20 61 64 64 65 64 20   has been added 
2a4f0 61 73 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65  as a leaf of the
2a500 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20 73 6f   freelist and so
2a510 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   its.** content 
2a520 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72  no longer matter
2a530 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65  s..**.** The ove
2a540 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20  rlying software 
2a550 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73  layer calls this
2a560 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c   routine when al
2a570 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a  l of the data.**
2a580 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
2a590 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 54 68  ge is unused. Th
2a5a0 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68  e pager marks th
2a5b0 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20  e page as clean 
2a5c0 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f  so.** that it do
2a5d0 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74  es not get writt
2a5e0 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  en to disk..**.*
2a5f0 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61  * Tests show tha
2a600 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  t this optimizat
2a610 69 6f 6e 20 63 61 6e 20 71 75 61 64 72 75 70 6c  ion can quadrupl
2a620 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c  e the speed of l
2a630 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45 54 45 20  arge .** DELETE 
2a640 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76  operations..*/.v
2a650 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
2a660 44 6f 6e 74 57 72 69 74 65 28 50 67 48 64 72 20  DontWrite(PgHdr 
2a670 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
2a680 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
2a690 61 67 65 72 3b 0a 20 20 69 66 28 20 28 70 50 67  ager;.  if( (pPg
2a6a0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
2a6b0 52 54 59 29 20 26 26 20 70 50 61 67 65 72 2d 3e  RTY) && pPager->
2a6c0 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b  nSavepoint==0 ){
2a6d0 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
2a6e0 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67  ("DONT_WRITE pag
2a6f0 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  e %d of %d\n", p
2a700 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49  Pg->pgno, PAGERI
2a710 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
2a720 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e   IOTRACE(("CLEAN
2a730 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
2a740 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20  r, pPg->pgno)). 
2a750 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
2a760 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54   PGHDR_DONT_WRIT
2a770 45 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  E;.#ifdef SQLITE
2a780 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
2a790 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
2a7a0 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
2a7b0 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  pPg);.#endif.  }
2a7c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2a7d0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2a7e0 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68   to increment th
2a7f0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64  e value of the d
2a800 61 74 61 62 61 73 65 20 66 69 6c 65 20 0a 2a 2a  atabase file .**
2a810 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c   change-counter,
2a820 20 73 74 6f 72 65 64 20 61 73 20 61 20 34 2d 62   stored as a 4-b
2a830 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
2a840 6e 74 65 67 65 72 20 73 74 61 72 74 69 6e 67 20  nteger starting 
2a850 61 74 20 0a 2a 2a 20 62 79 74 65 20 6f 66 66 73  at .** byte offs
2a860 65 74 20 32 34 20 6f 66 20 74 68 65 20 70 61 67  et 24 of the pag
2a870 65 72 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  er file..**.** I
2a880 66 20 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f  f the isDirectMo
2a890 64 65 20 66 6c 61 67 20 69 73 20 7a 65 72 6f 2c  de flag is zero,
2a8a0 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 64 6f   then this is do
2a8b0 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 0a 2a  ne by calling .*
2a8c0 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  * sqlite3PagerWr
2a8d0 69 74 65 28 29 20 6f 6e 20 70 61 67 65 20 31 2c  ite() on page 1,
2a8e0 20 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20   then modifying 
2a8f0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2a900 74 68 65 0a 2a 2a 20 70 61 67 65 20 64 61 74 61  the.** page data
2a910 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
2a920 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  he file will be 
2a930 75 70 64 61 74 65 64 20 77 68 65 6e 20 74 68 65  updated when the
2a940 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e   current.** tran
2a950 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
2a960 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tted..**.** The 
2a970 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c 61  isDirectMode fla
2a980 67 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 6e 6f  g may only be no
2a990 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 6c 69  n-zero if the li
2a9a0 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c  brary was compil
2a9b0 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 53  ed.** with the S
2a9c0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
2a9d0 4d 49 43 5f 57 52 49 54 45 20 6d 61 63 72 6f 20  MIC_WRITE macro 
2a9e0 64 65 66 69 6e 65 64 2e 20 49 6e 20 74 68 69 73  defined. In this
2a9f0 20 63 61 73 65 2c 0a 2a 2a 20 69 66 20 69 73 44   case,.** if isD
2aa00 69 72 65 63 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  irect is non-zer
2aa10 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  o, then the data
2aa20 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 70 64  base file is upd
2aa30 61 74 65 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a  ated directly.**
2aa40 20 62 79 20 77 72 69 74 69 6e 67 20 61 6e 20 75   by writing an u
2aa50 70 64 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f  pdated version o
2aa60 66 20 70 61 67 65 20 31 20 75 73 69 6e 67 20 61  f page 1 using a
2aa70 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 0a 2a 2a   call to the .**
2aa80 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
2aa90 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ) function..*/.s
2aaa0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
2aab0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
2aac0 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
2aad0 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74 4d 6f  , int isDirectMo
2aae0 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  de){.  int rc = 
2aaf0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
2ab00 20 44 65 63 6c 61 72 65 20 61 6e 64 20 69 6e 69   Declare and ini
2ab10 74 69 61 6c 69 7a 65 20 63 6f 6e 73 74 61 6e 74  tialize constant
2ab20 20 69 6e 74 65 67 65 72 20 27 69 73 44 69 72 65   integer 'isDire
2ab30 63 74 27 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a  ct'. If the.  **
2ab40 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
2ab50 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
2ab60 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75  abled in this bu
2ab70 69 6c 64 2c 20 74 68 65 6e 20 69 73 44 69 72 65  ild, then isDire
2ab80 63 74 0a 20 20 2a 2a 20 69 73 20 69 6e 69 74 69  ct.  ** is initi
2ab90 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76 61  alized to the va
2aba0 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
2abb0 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 70  e isDirectMode p
2abc0 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 20 74 6f  arameter.  ** to
2abd0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
2abe0 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 69 73  Otherwise, it is
2abf0 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 7a   always set to z
2ac00 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ero..  **.  ** T
2ac10 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20  he idea is that 
2ac20 69 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  if the atomic-wr
2ac30 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
2ac40 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61   is not.  ** ena
2ac50 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20  bled at compile 
2ac60 74 69 6d 65 2c 20 74 68 65 20 63 6f 6d 70 69 6c  time, the compil
2ac70 65 72 20 63 61 6e 20 6f 6d 69 74 20 74 68 65 20  er can omit the 
2ac80 74 65 73 74 73 20 6f 66 0a 20 20 2a 2a 20 27 69  tests of.  ** 'i
2ac90 73 44 69 72 65 63 74 27 20 62 65 6c 6f 77 2c 20  sDirect' below, 
2aca0 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62  as well as the b
2acb0 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65 64 20 69 6e  lock enclosed in
2acc0 20 74 68 65 0a 20 20 2a 2a 20 22 69 66 28 20 69   the.  ** "if( i
2acd0 73 44 69 72 65 63 74 20 29 22 20 63 6f 6e 64 69  sDirect )" condi
2ace0 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  tion..  */.#ifnd
2acf0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2ad00 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 23 20  _ATOMIC_WRITE.# 
2ad10 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f  define DIRECT_MO
2ad20 44 45 20 30 0a 20 20 61 73 73 65 72 74 28 20 69  DE 0.  assert( i
2ad30 73 44 69 72 65 63 74 4d 6f 64 65 3d 3d 30 20 29  sDirectMode==0 )
2ad40 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2ad50 45 54 45 52 28 69 73 44 69 72 65 63 74 4d 6f 64  ETER(isDirectMod
2ad60 65 29 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  e);.#else.# defi
2ad70 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 69  ne DIRECT_MODE i
2ad80 73 44 69 72 65 63 74 4d 6f 64 65 0a 23 65 6e 64  sDirectMode.#end
2ad90 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  if..  assert( pP
2ada0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
2adb0 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
2adc0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68   if( !pPager->ch
2add0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 26 26  angeCountDone &&
2ade0 20 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e   ALWAYS(pPager->
2adf0 64 62 53 69 7a 65 3e 30 29 20 29 7b 0a 20 20 20  dbSize>0) ){.   
2ae00 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 20   PgHdr *pPgHdr; 
2ae10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ae20 2a 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20 70  * Reference to p
2ae30 61 67 65 20 31 20 2a 2f 0a 20 20 20 20 75 33 32  age 1 */.    u32
2ae40 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b   change_counter;
2ae50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2ae60 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 63  itial value of c
2ae70 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69  hange-counter fi
2ae80 65 6c 64 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  eld */..    asse
2ae90 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
2aea0 70 46 69 6c 65 20 26 26 20 69 73 4f 70 65 6e 28  pFile && isOpen(
2aeb0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a  pPager->fd) );..
2aec0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65      /* Open page
2aed0 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66   1 of the file f
2aee0 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20  or writing. */. 
2aef0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2af00 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
2af10 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20  1, &pPgHdr);.   
2af20 20 61 73 73 65 72 74 28 20 70 50 67 48 64 72 3d   assert( pPgHdr=
2af30 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
2af40 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  _OK );..    /* I
2af50 66 20 70 61 67 65 20 6f 6e 65 20 77 61 73 20 66  f page one was f
2af60 65 74 63 68 65 64 20 73 75 63 63 65 73 73 66 75  etched successfu
2af70 6c 6c 79 2c 20 61 6e 64 20 74 68 69 73 20 66 75  lly, and this fu
2af80 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20  nction is not.  
2af90 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 69    ** operating i
2afa0 6e 20 64 69 72 65 63 74 2d 6d 6f 64 65 2c 20 6d  n direct-mode, m
2afb0 61 6b 65 20 70 61 67 65 20 31 20 77 72 69 74 61  ake page 1 writa
2afc0 62 6c 65 2e 20 20 57 68 65 6e 20 6e 6f 74 20 69  ble.  When not i
2afd0 6e 20 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  n .    ** direct
2afe0 20 6d 6f 64 65 2c 20 70 61 67 65 20 31 20 69 73   mode, page 1 is
2aff0 20 61 6c 77 61 79 73 20 68 65 6c 64 20 69 6e 20   always held in 
2b000 63 61 63 68 65 20 61 6e 64 20 68 65 6e 63 65 20  cache and hence 
2b010 74 68 65 20 50 61 67 65 72 47 65 74 28 29 0a 20  the PagerGet(). 
2b020 20 20 20 2a 2a 20 61 62 6f 76 65 20 69 73 20 61     ** above is a
2b030 6c 77 61 79 73 20 73 75 63 63 65 73 73 66 75 6c  lways successful
2b040 20 2d 20 68 65 6e 63 65 20 74 68 65 20 41 4c 57   - hence the ALW
2b050 41 59 53 20 6f 6e 20 72 63 3d 3d 53 51 4c 49 54  AYS on rc==SQLIT
2b060 45 5f 4f 4b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  E_OK..    */.   
2b070 20 69 66 28 20 21 44 49 52 45 43 54 5f 4d 4f 44   if( !DIRECT_MOD
2b080 45 20 26 26 20 41 4c 57 41 59 53 28 72 63 3d 3d  E && ALWAYS(rc==
2b090 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20  SQLITE_OK) ){.  
2b0a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b0b0 50 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64  PagerWrite(pPgHd
2b0c0 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  r);.    }..    i
2b0d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2b0e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 63   ){.      /* Inc
2b0f0 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65  rement the value
2b100 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77   just read and w
2b110 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20  rite it back to 
2b120 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20  byte 24. */.    
2b130 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
2b140 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
2b150 74 65 28 28 75 38 2a 29 70 50 61 67 65 72 2d 3e  te((u8*)pPager->
2b160 64 62 46 69 6c 65 56 65 72 73 29 3b 0a 20 20 20  dbFileVers);.   
2b170 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65     change_counte
2b180 72 2b 2b 3b 0a 20 20 20 20 20 20 70 75 74 33 32  r++;.      put32
2b190 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67  bits(((char*)pPg
2b1a0 48 64 72 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20  Hdr->pData)+24, 
2b1b0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b  change_counter);
2b1c0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 75  ..      /* If ru
2b1d0 6e 6e 69 6e 67 20 69 6e 20 64 69 72 65 63 74 20  nning in direct 
2b1e0 6d 6f 64 65 2c 20 77 72 69 74 65 20 74 68 65 20  mode, write the 
2b1f0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67 65  contents of page
2b200 20 31 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   1 to the file. 
2b210 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 44 49 52  */.      if( DIR
2b220 45 43 54 5f 4d 4f 44 45 20 29 7b 0a 20 20 20 20  ECT_MODE ){.    
2b230 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a      const void *
2b240 7a 42 75 66 20 3d 20 70 50 67 48 64 72 2d 3e 70  zBuf = pPgHdr->p
2b250 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 61 73  Data;.        as
2b260 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
2b270 46 69 6c 65 53 69 7a 65 3e 30 20 29 3b 0a 20 20  FileSize>0 );.  
2b280 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2b290 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
2b2a0 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67  ->fd, zBuf, pPag
2b2b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30 29  er->pageSize, 0)
2b2c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2b2d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b2e0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
2b2f0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
2b300 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
2b310 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2b320 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61       pPager->cha
2b330 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31  ngeCountDone = 1
2b340 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2b350 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
2b360 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65 6e  the page referen
2b370 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ce. */.    sqlit
2b380 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
2b390 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Hdr);.  }.  retu
2b3a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2b3b0 53 79 6e 63 20 74 68 65 20 70 61 67 65 72 20 66  Sync the pager f
2b3c0 69 6c 65 20 74 6f 20 64 69 73 6b 2e 20 54 68 69  ile to disk. Thi
2b3d0 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  s is a no-op for
2b3e0 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73   in-memory files
2b3f0 0a 2a 2a 20 6f 72 20 70 61 67 65 73 20 77 69 74  .** or pages wit
2b400 68 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79  h the Pager.noSy
2b410 6e 63 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a  nc flag set..**.
2b420 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
2b430 2c 20 6f 72 20 63 61 6c 6c 65 64 20 6f 6e 20 61  , or called on a
2b440 20 70 61 67 65 72 20 66 6f 72 20 77 68 69 63 68   pager for which
2b450 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20   it is a no-op, 
2b460 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
2b470 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
2b480 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  OK. Otherwise, a
2b490 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
2b4a0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
2b4b0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2b4c0 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67  Sync(Pager *pPag
2b4d0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
2b4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2b500 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2b510 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
2b520 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2b530 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63  noSync ){.    rc
2b540 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2b550 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
2b560 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
2b570 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
2b580 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
2b590 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2b5a0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
2b5b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2b5c0 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50  for the pager pP
2b5d0 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f  ager. zMaster po
2b5e0 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65  ints to the name
2b5f0 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20  .** of a master 
2b600 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
2b610 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
2b620 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64  ten into the ind
2b630 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e  ividual.** journ
2b640 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72  al file. zMaster
2b650 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68   may be NULL, wh
2b660 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74  ich is interpret
2b670 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a  ed as no master.
2b680 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69  ** journal (a si
2b690 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
2b6a0 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a  ansaction)..**.*
2b6b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
2b6c0 6e 73 75 72 65 73 20 74 68 61 74 3a 0a 2a 2a 0a  nsures that:.**.
2b6d0 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61 62  **   * The datab
2b6e0 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d  ase file change-
2b6f0 63 6f 75 6e 74 65 72 20 69 73 20 75 70 64 61 74  counter is updat
2b700 65 64 2c 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6a  ed,.**   * the j
2b710 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
2b720 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61 74 6f   (unless the ato
2b730 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
2b740 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64 29 2c  zation is used),
2b750 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 64 69 72 74  .**   * all dirt
2b760 79 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74  y pages are writ
2b770 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
2b780 61 73 65 20 66 69 6c 65 2c 20 0a 2a 2a 20 20 20  ase file, .**   
2b790 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
2b7a0 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
2b7b0 20 28 69 66 20 72 65 71 75 69 72 65 64 29 2c 20   (if required), 
2b7c0 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64  and.**   * the d
2b7d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e  atabase file syn
2b7e0 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ced. .**.** The 
2b7f0 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 20  only thing that 
2b800 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69  remains to commi
2b810 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
2b820 6e 20 69 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65  n is to finalize
2b830 20 0a 2a 2a 20 28 64 65 6c 65 74 65 2c 20 74 72   .** (delete, tr
2b840 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74  uncate or zero t
2b850 68 65 20 66 69 72 73 74 20 70 61 72 74 20 6f 66  he first part of
2b860 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  ) the journal fi
2b870 6c 65 20 28 6f 72 20 0a 2a 2a 20 64 65 6c 65 74  le (or .** delet
2b880 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
2b890 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65  rnal file if spe
2b8a0 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e  cified)..**.** N
2b8b0 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73  ote that if zMas
2b8c0 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20  ter==NULL, this 
2b8d0 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69  does not overwri
2b8e0 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76 61  te a previous va
2b8f0 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f  lue.** passed to
2b900 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72   an sqlite3Pager
2b910 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
2b920 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   call..**.** If 
2b930 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65  the final parame
2b940 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69  ter - noSync - i
2b950 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
2b960 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2b970 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74 20  tself.** is not 
2b980 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61 6c 6c  synced. The call
2b990 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c  er must call sql
2b9a0 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 29 20  ite3PagerSync() 
2b9b0 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 73  directly to.** s
2b9c0 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
2b9d0 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c   file before cal
2b9e0 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73 65  ling CommitPhase
2b9f0 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74 65 20  Two() to delete 
2ba00 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
2ba10 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ile in this case
2ba20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2ba30 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
2ba40 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  One(.  Pager *pP
2ba50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
2ba60 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
2ba70 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73  object */.  cons
2ba80 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c  t char *zMaster,
2ba90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2baa0 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20  f not NULL, the 
2bab0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
2bac0 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 53  ame */.  int noS
2bad0 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20  ync             
2bae0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2baf0 20 74 6f 20 6f 6d 69 74 20 74 68 65 20 78 53 79   to omit the xSy
2bb00 6e 63 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c  nc on the db fil
2bb10 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
2bb20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2bb30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2bb40 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
2bb50 2a 20 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65  * The dbOrigSize
2bb60 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 69 66   is never set if
2bb70 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46   journal_mode=OF
2bb80 46 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  F */.  assert( p
2bb90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2bba0 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
2bbb0 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 50 61  LMODE_OFF || pPa
2bbc0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
2bbd0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  =0 );..  /* If a
2bbe0 20 70 72 69 6f 72 20 65 72 72 6f 72 20 6f 63 63   prior error occ
2bbf0 75 72 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74  urred, this rout
2bc00 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  ine should not b
2bc10 65 20 63 61 6c 6c 65 64 2e 20 20 52 4f 4c 4c 42  e called.  ROLLB
2bc20 41 43 4b 0a 20 20 2a 2a 20 69 73 20 74 68 65 20  ACK.  ** is the 
2bc30 61 70 70 72 6f 70 72 69 61 74 65 20 72 65 73 70  appropriate resp
2bc40 6f 6e 73 65 20 74 6f 20 61 6e 20 65 72 72 6f 72  onse to an error
2bc50 2c 20 6e 6f 74 20 43 4f 4d 4d 49 54 2e 20 20 47  , not COMMIT.  G
2bc60 75 61 72 64 20 61 67 61 69 6e 73 74 0a 20 20 2a  uard against.  *
2bc70 2a 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 73 20  * coding errors 
2bc80 62 79 20 72 65 70 65 61 74 69 6e 67 20 74 68 65  by repeating the
2bc90 20 70 72 69 6f 72 20 65 72 72 6f 72 2e 20 2a 2f   prior error. */
2bca0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
2bcb0 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20  ger->errCode) ) 
2bcc0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
2bcd0 72 72 43 6f 64 65 3b 0a 0a 20 20 50 41 47 45 52  rrCode;..  PAGER
2bce0 54 52 41 43 45 28 28 22 44 41 54 41 42 41 53 45  TRACE(("DATABASE
2bcf0 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a   SYNC: File=%s z
2bd00 4d 61 73 74 65 72 3d 25 73 20 6e 53 69 7a 65 3d  Master=%s nSize=
2bd10 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50  %d\n", .      pP
2bd20 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2bd30 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
2bd40 2d 3e 64 62 53 69 7a 65 29 29 3b 0a 0a 20 20 69  ->dbSize));..  i
2bd50 66 28 20 4d 45 4d 44 42 20 26 26 20 70 50 61 67  f( MEMDB && pPag
2bd60 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29  er->dbModified )
2bd70 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  {.    /* If this
2bd80 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
2bd90 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73   db, or no pages
2bda0 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
2bdb0 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20  en to, or this. 
2bdc0 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68     ** function h
2bdd0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
2bde0 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 6d 6f  called, it is mo
2bdf0 73 74 6c 79 20 61 20 6e 6f 2d 6f 70 2e 20 20 48  stly a no-op.  H
2be00 6f 77 65 76 65 72 2c 20 61 6e 79 0a 20 20 20 20  owever, any.    
2be10 2a 2a 20 62 61 63 6b 75 70 20 69 6e 20 70 72 6f  ** backup in pro
2be20 67 72 65 73 73 20 6e 65 65 64 73 20 74 6f 20 62  gress needs to b
2be30 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20 20  e restarted..   
2be40 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
2be50 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61  ackupRestart(pPa
2be60 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20  ger->pBackup);. 
2be70 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
2be80 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
2be90 53 59 4e 43 45 44 20 26 26 20 70 50 61 67 65 72  SYNCED && pPager
2bea0 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a  ->dbModified ){.
2beb0 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
2bec0 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 75 70 64 61  owing block upda
2bed0 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63  tes the change-c
2bee0 6f 75 6e 74 65 72 2e 20 45 78 61 63 74 6c 79 20  ounter. Exactly 
2bef0 68 6f 77 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f  how it.    ** do
2bf00 65 73 20 74 68 69 73 20 64 65 70 65 6e 64 73 20  es this depends 
2bf10 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
2bf20 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64  t the atomic-upd
2bf30 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ate optimization
2bf40 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 6e 61 62  .    ** was enab
2bf50 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  led at compile t
2bf60 69 6d 65 2c 20 61 6e 64 20 69 66 20 74 68 69 73  ime, and if this
2bf70 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65 65   transaction mee
2bf80 74 73 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72  ts the .    ** r
2bf90 75 6e 74 69 6d 65 20 63 72 69 74 65 72 69 61 20  untime criteria 
2bfa0 74 6f 20 75 73 65 20 74 68 65 20 6f 70 65 72 61  to use the opera
2bfb0 74 69 6f 6e 3a 20 0a 20 20 20 20 2a 2a 0a 20 20  tion: .    **.  
2bfc0 20 20 2a 2a 20 20 20 20 2a 20 54 68 65 20 66 69    **    * The fi
2bfd0 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le-system suppor
2bfe0 74 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ts the atomic-wr
2bff0 69 74 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72  ite property for
2c000 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f  .    **      blo
2c010 63 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65  cks of size page
2c020 2d 73 69 7a 65 2c 20 61 6e 64 20 0a 20 20 20 20  -size, and .    
2c030 2a 2a 20 20 20 20 2a 20 54 68 69 73 20 63 6f 6d  **    * This com
2c040 6d 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20  mit is not part 
2c050 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  of a multi-file 
2c060 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64  transaction, and
2c070 0a 20 20 20 20 2a 2a 20 20 20 20 2a 20 45 78 61  .    **    * Exa
2c080 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61  ctly one page ha
2c090 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  s been modified 
2c0a0 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65  and store in the
2c0b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
2c0c0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
2c0d0 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
2c0e0 20 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64   was not enabled
2c0f0 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
2c100 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a  , then the.    *
2c110 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  * pager_incr_cha
2c120 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 66 75 6e  ngecounter() fun
2c130 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
2c140 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
2c150 61 6e 67 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e  ange.    ** coun
2c160 74 65 72 20 69 6e 20 27 69 6e 64 69 72 65 63 74  ter in 'indirect
2c170 2d 6d 6f 64 65 27 2e 20 49 66 20 74 68 65 20 6f  -mode'. If the o
2c180 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 63  ptimization is c
2c190 6f 6d 70 69 6c 65 64 20 69 6e 20 62 75 74 0a 20  ompiled in but. 
2c1a0 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 70 70     ** is not app
2c1b0 6c 69 63 61 62 6c 65 20 74 6f 20 74 68 69 73 20  licable to this 
2c1c0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 63 61 6c  transaction, cal
2c1d0 6c 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  l sqlite3Journal
2c1e0 43 72 65 61 74 65 28 29 0a 20 20 20 20 2a 2a 20  Create().    ** 
2c1f0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
2c200 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
2c210 73 20 61 63 74 75 61 6c 6c 79 20 62 65 65 6e 20  s actually been 
2c220 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63 61  created, then ca
2c230 6c 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f  ll.    ** pager_
2c240 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
2c250 65 72 28 29 20 74 6f 20 75 70 64 61 74 65 20 74  er() to update t
2c260 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2c270 72 20 69 6e 20 69 6e 64 69 72 65 63 74 0a 20 20  r in indirect.  
2c280 20 20 2a 2a 20 6d 6f 64 65 2e 20 0a 20 20 20 20    ** mode. .    
2c290 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77  **.    ** Otherw
2c2a0 69 73 65 2c 20 69 66 20 74 68 65 20 6f 70 74 69  ise, if the opti
2c2b0 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 6f 74 68  mization is both
2c2c0 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 61 70 70   enabled and app
2c2d0 6c 69 63 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20  licable,.    ** 
2c2e0 74 68 65 6e 20 63 61 6c 6c 20 70 61 67 65 72 5f  then call pager_
2c2f0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
2c300 65 72 28 29 20 74 6f 20 75 70 64 61 74 65 20 74  er() to update t
2c310 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2c320 72 0a 20 20 20 20 2a 2a 20 69 6e 20 27 64 69 72  r.    ** in 'dir
2c330 65 63 74 27 20 6d 6f 64 65 2e 20 49 6e 20 74 68  ect' mode. In th
2c340 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72  is case the jour
2c350 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65  nal file will ne
2c360 76 65 72 20 62 65 0a 20 20 20 20 2a 2a 20 63 72  ver be.    ** cr
2c370 65 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 74  eated for this t
2c380 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
2c390 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2c3a0 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
2c3b0 52 49 54 45 0a 20 20 20 20 50 67 48 64 72 20 2a  RITE.    PgHdr *
2c3c0 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pPg;.    assert(
2c3d0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2c3e0 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  jfd) || pPager->
2c3f0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
2c400 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2c410 46 46 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  FF );.    if( !z
2c420 4d 61 73 74 65 72 20 26 26 20 69 73 4f 70 65 6e  Master && isOpen
2c430 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20  (pPager->jfd) . 
2c440 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a      && pPager->j
2c450 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42  ournalOff==jrnlB
2c460 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
2c470 29 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65  ) .     && pPage
2c480 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50 61 67 65  r->dbSize>=pPage
2c490 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20  r->dbFileSize.  
2c4a0 20 20 20 26 26 20 28 30 3d 3d 28 70 50 67 20 3d     && (0==(pPg =
2c4b0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69   sqlite3PcacheDi
2c4c0 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e  rtyList(pPager->
2c4d0 70 50 43 61 63 68 65 29 29 20 7c 7c 20 30 3d 3d  pPCache)) || 0==
2c4e0 70 50 67 2d 3e 70 44 69 72 74 79 29 0a 20 20 20  pPg->pDirty).   
2c4f0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 70 64   ){.      /* Upd
2c500 61 74 65 20 74 68 65 20 64 62 20 66 69 6c 65 20  ate the db file 
2c510 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 76  change counter v
2c520 69 61 20 74 68 65 20 64 69 72 65 63 74 2d 77 72  ia the direct-wr
2c530 69 74 65 20 6d 65 74 68 6f 64 2e 20 54 68 65 20  ite method. The 
2c540 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77  .      ** follow
2c550 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f  ing call will mo
2c560 64 69 66 79 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  dify the in-memo
2c570 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
2c580 6e 20 6f 66 20 70 61 67 65 20 31 20 0a 20 20 20  n of page 1 .   
2c590 20 20 20 2a 2a 20 74 6f 20 69 6e 63 6c 75 64 65     ** to include
2c5a0 20 74 68 65 20 75 70 64 61 74 65 64 20 63 68 61   the updated cha
2c5b0 6e 67 65 20 63 6f 75 6e 74 65 72 20 61 6e 64 20  nge counter and 
2c5c0 74 68 65 6e 20 77 72 69 74 65 20 70 61 67 65 20  then write page 
2c5d0 31 20 0a 20 20 20 20 20 20 2a 2a 20 64 69 72 65  1 .      ** dire
2c5e0 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61  ctly to the data
2c5f0 62 61 73 65 20 66 69 6c 65 2e 20 42 65 63 61 75  base file. Becau
2c600 73 65 20 6f 66 20 74 68 65 20 61 74 6f 6d 69 63  se of the atomic
2c610 2d 77 72 69 74 65 20 0a 20 20 20 20 20 20 2a 2a  -write .      **
2c620 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
2c630 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65   host file-syste
2c640 6d 2c 20 74 68 69 73 20 69 73 20 73 61 66 65 2e  m, this is safe.
2c650 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2c660 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f  rc = pager_incr_
2c670 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50  changecounter(pP
2c680 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 65  ager, 1);.    }e
2c690 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
2c6a0 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72  sqlite3JournalCr
2c6b0 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  eate(pPager->jfd
2c6c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2c6d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c6e0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2c6f0 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
2c700 74 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ter(pPager, 0);.
2c710 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
2c720 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 70 61 67  lse.    rc = pag
2c730 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
2c740 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30 29  unter(pPager, 0)
2c750 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
2c760 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2c770 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
2c780 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20 20  se_one_exit;..  
2c790 20 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61    /* If this tra
2c7a0 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64  nsaction has mad
2c7b0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
2c7c0 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c  maller, then all
2c7d0 20 70 61 67 65 73 0a 20 20 20 20 2a 2a 20 62 65   pages.    ** be
2c7e0 69 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79  ing discarded by
2c7f0 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20   the truncation 
2c800 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20  must be written 
2c810 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
2c820 20 20 20 2a 2a 20 66 69 6c 65 2e 20 54 68 69 73     ** file. This
2c830 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
2c840 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   in auto-vacuum 
2c850 6d 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  mode..    **.   
2c860 20 2a 2a 20 42 65 66 6f 72 65 20 72 65 61 64 69   ** Before readi
2c870 6e 67 20 74 68 65 20 70 61 67 65 73 20 77 69 74  ng the pages wit
2c880 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 6c  h page numbers l
2c890 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a  arger than the .
2c8a0 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 76      ** current v
2c8b0 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
2c8c0 53 69 7a 65 2c 20 73 65 74 20 64 62 53 69 7a 65  Size, set dbSize
2c8d0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c   back to the val
2c8e0 75 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69  ue.    ** that i
2c8f0 74 20 74 6f 6f 6b 20 61 74 20 74 68 65 20 73 74  t took at the st
2c900 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
2c910 61 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73  action. Otherwis
2c920 65 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61  e, the.    ** ca
2c930 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61  lls to sqlite3Pa
2c940 67 65 72 47 65 74 28 29 20 72 65 74 75 72 6e 20  gerGet() return 
2c950 7a 65 72 6f 65 64 20 70 61 67 65 73 20 69 6e 73  zeroed pages ins
2c960 74 65 61 64 20 6f 66 20 0a 20 20 20 20 2a 2a 20  tead of .    ** 
2c970 72 65 61 64 69 6e 67 20 64 61 74 61 20 66 72 6f  reading data fro
2c980 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
2c990 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
2c9a0 2a 2a 20 57 68 65 6e 20 6a 6f 75 72 6e 61 6c 5f  ** When journal_
2c9b0 6d 6f 64 65 3d 3d 4f 46 46 20 74 68 65 20 64 62  mode==OFF the db
2c9c0 4f 72 69 67 53 69 7a 65 20 69 73 20 61 6c 77 61  OrigSize is alwa
2c9d0 79 73 20 7a 65 72 6f 2c 20 73 6f 20 74 68 69 73  ys zero, so this
2c9e0 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6e 65  .    ** block ne
2c9f0 76 65 72 20 72 75 6e 73 20 69 66 20 6a 6f 75 72  ver runs if jour
2ca00 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 2e 0a 20 20  nal_mode=OFF..  
2ca10 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
2ca20 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2ca30 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67  UUM.    if( pPag
2ca40 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 61 67 65  er->dbSize<pPage
2ca50 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20  r->dbOrigSize . 
2ca60 20 20 20 20 26 26 20 41 4c 57 41 59 53 28 70 50      && ALWAYS(pP
2ca70 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2ca80 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
2ca90 4d 4f 44 45 5f 4f 46 46 29 0a 20 20 20 20 29 7b  MODE_OFF).    ){
2caa0 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 20 20  .      Pgno i;  
2cab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cad0 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
2cae0 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 63  iable */.      c
2caf0 6f 6e 73 74 20 50 67 6e 6f 20 69 53 6b 69 70 20  onst Pgno iSkip 
2cb00 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  = PAGER_MJ_PGNO(
2cb10 70 50 61 67 65 72 29 3b 20 2f 2a 20 50 65 6e 64  pPager); /* Pend
2cb20 69 6e 67 20 6c 6f 63 6b 20 70 61 67 65 20 2a 2f  ing lock page */
2cb30 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 50 67 6e  .      const Pgn
2cb40 6f 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  o dbSize = pPage
2cb50 72 2d 3e 64 62 53 69 7a 65 3b 20 20 20 20 20 20  r->dbSize;      
2cb60 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6d 61   /* Database ima
2cb70 67 65 20 73 69 7a 65 20 2a 2f 20 0a 20 20 20 20  ge size */ .    
2cb80 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
2cb90 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69   = pPager->dbOri
2cba0 67 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 6f 72  gSize;.      for
2cbb0 28 20 69 3d 64 62 53 69 7a 65 2b 31 3b 20 69 3c  ( i=dbSize+1; i<
2cbc0 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
2cbd0 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20  ize; i++ ){.    
2cbe0 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
2cbf0 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
2cc00 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69  r->pInJournal, i
2cc10 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b  ) && i!=iSkip ){
2cc20 0a 20 20 20 20 20 20 20 20 20 20 50 67 48 64 72  .          PgHdr
2cc30 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20   *pPage;        
2cc40 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20       /* Page to 
2cc50 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 20  journal */.     
2cc60 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2cc70 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
2cc80 2c 20 69 2c 20 26 70 50 61 67 65 29 3b 0a 20 20  , i, &pPage);.  
2cc90 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2cca0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2ccb0 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
2ccc0 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  e_exit;.        
2ccd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2cce0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 29 3b  gerWrite(pPage);
2ccf0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2cd00 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
2cd10 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
2cd20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2cd30 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70   ) goto commit_p
2cd40 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20  hase_one_exit;. 
2cd50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2cd60 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e   .      pPager->
2cd70 64 62 53 69 7a 65 20 3d 20 64 62 53 69 7a 65 3b  dbSize = dbSize;
2cd80 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
2cd90 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
2cda0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
2cdb0 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ame into the jou
2cdc0 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 20  rnal file. If a 
2cdd0 6d 61 73 74 65 72 20 0a 20 20 20 20 2a 2a 20 6a  master .    ** j
2cde0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
2cdf0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
2ce00 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
2ce10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 0a   journal file, .
2ce20 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 7a 4d 61      ** or if zMa
2ce30 73 74 65 72 20 69 73 20 4e 55 4c 4c 20 28 6e 6f  ster is NULL (no
2ce40 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 29   master journal)
2ce50 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c  , then this call
2ce60 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20   is a no-op..   
2ce70 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 72 69   */.    rc = wri
2ce80 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
2ce90 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29  pPager, zMaster)
2cea0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2ceb0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63  LITE_OK ) goto c
2cec0 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
2ced0 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53 79  exit;..    /* Sy
2cee0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
2cef0 69 6c 65 2e 20 49 66 20 74 68 65 20 61 74 6f 6d  ile. If the atom
2cf00 69 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69  ic-update optimi
2cf10 7a 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 0a  zation is being.
2cf20 20 20 20 20 2a 2a 20 75 73 65 64 2c 20 74 68 69      ** used, thi
2cf30 73 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20  s call will not 
2cf40 63 72 65 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  create the journ
2cf50 61 6c 20 66 69 6c 65 20 6f 72 20 70 65 72 66 6f  al file or perfo
2cf60 72 6d 20 61 6e 79 0a 20 20 20 20 2a 2a 20 72 65  rm any.    ** re
2cf70 61 6c 20 49 4f 2e 0a 20 20 20 20 2a 2f 0a 20 20  al IO..    */.  
2cf80 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
2cf90 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
2cfa0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2cfb0 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f  K ) goto commit_
2cfc0 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a  phase_one_exit;.
2cfd0 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c  .    /* Write al
2cfe0 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  l dirty pages to
2cff0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2d000 6c 65 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  le. */.    rc = 
2d010 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
2d020 6c 69 73 74 28 73 71 6c 69 74 65 33 50 63 61 63  list(sqlite3Pcac
2d030 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
2d040 65 72 2d 3e 70 50 43 61 63 68 65 29 29 3b 0a 20  er->pPCache));. 
2d050 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2d060 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
2d070 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
2d080 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29  _IOERR_BLOCKED )
2d090 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 63 6f 6d  ;.      goto com
2d0a0 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
2d0b0 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  it;.    }.    sq
2d0c0 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e  lite3PcacheClean
2d0d0 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61  All(pPager->pPCa
2d0e0 63 68 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  che);..    /* If
2d0f0 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
2d100 6b 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61 6d  k is not the sam
2d110 65 20 73 69 7a 65 20 61 73 20 74 68 65 20 64 61  e size as the da
2d120 74 61 62 61 73 65 20 69 6d 61 67 65 2c 0a 20 20  tabase image,.  
2d130 20 20 2a 2a 20 74 68 65 6e 20 75 73 65 20 70 61    ** then use pa
2d140 67 65 72 5f 74 72 75 6e 63 61 74 65 20 74 6f 20  ger_truncate to 
2d150 67 72 6f 77 20 6f 72 20 73 68 72 69 6e 6b 20 74  grow or shrink t
2d160 68 65 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20  he file here..  
2d170 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
2d180 67 65 72 2d 3e 64 62 53 69 7a 65 21 3d 70 50 61  ger->dbSize!=pPa
2d190 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
2d1a0 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 4e  ){.      Pgno nN
2d1b0 65 77 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ew = pPager->dbS
2d1c0 69 7a 65 20 2d 20 28 70 50 61 67 65 72 2d 3e 64  ize - (pPager->d
2d1d0 62 53 69 7a 65 3d 3d 50 41 47 45 52 5f 4d 4a 5f  bSize==PAGER_MJ_
2d1e0 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a 20  PGNO(pPager));. 
2d1f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
2d200 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
2d210 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  R_EXCLUSIVE );. 
2d220 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
2d230 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
2d240 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66   nNew);.      if
2d250 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d260 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68  ) goto commit_ph
2d270 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20  ase_one_exit;.  
2d280 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61    }..    /* Fina
2d290 6c 6c 79 2c 20 73 79 6e 63 20 74 68 65 20 64 61  lly, sync the da
2d2a0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
2d2b0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
2d2c0 3e 6e 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53 79  >noSync && !noSy
2d2d0 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nc ){.      rc =
2d2e0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
2d2f0 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
2d300 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
2d310 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43      }.    IOTRAC
2d320 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e 22  E(("DBSYNC %p\n"
2d330 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20  , pPager))..    
2d340 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
2d350 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20  PAGER_SYNCED;.  
2d360 7d 0a 0a 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  }..commit_phase_
2d370 6f 6e 65 5f 65 78 69 74 3a 0a 20 20 72 65 74 75  one_exit:.  retu
2d380 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2d390 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
2d3a0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ion is called, t
2d3b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2d3c0 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 6c 65   has been comple
2d3d0 74 65 6c 79 0a 2a 2a 20 75 70 64 61 74 65 64 20  tely.** updated 
2d3e0 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20 63  to reflect the c
2d3f0 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74  hanges made by t
2d400 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
2d410 61 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 73 79  action and.** sy
2d420 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 54 68  nced to disk. Th
2d430 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  e journal file s
2d440 74 69 6c 6c 20 65 78 69 73 74 73 20 69 6e 20 74  till exists in t
2d450 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 0a  he file-system .
2d460 2a 2a 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 69  ** though, and i
2d470 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75  f a failure occu
2d480 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  rs at this point
2d490 20 69 74 20 77 69 6c 6c 20 65 76 65 6e 74 75 61   it will eventua
2d4a0 6c 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 61  lly.** be used a
2d4b0 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  s a hot-journal 
2d4c0 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  and the current 
2d4d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
2d4e0 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ed back..**.** T
2d4f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e  his function fin
2d500 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e  alizes the journ
2d510 61 6c 20 66 69 6c 65 2c 20 65 69 74 68 65 72 20  al file, either 
2d520 62 79 20 64 65 6c 65 74 69 6e 67 2c 20 0a 2a 2a  by deleting, .**
2d530 20 74 72 75 6e 63 61 74 69 6e 67 20 6f 72 20 70   truncating or p
2d540 61 72 74 69 61 6c 6c 79 20 7a 65 72 6f 69 6e 67  artially zeroing
2d550 20 69 74 2c 20 73 6f 20 74 68 61 74 20 69 74 20   it, so that it 
2d560 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 0a  cannot be used .
2d570 2a 2a 20 66 6f 72 20 68 6f 74 2d 6a 6f 75 72 6e  ** for hot-journ
2d580 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 6e 63  al rollback. Onc
2d590 65 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 74  e this is done t
2d5a0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
2d5b0 73 0a 2a 2a 20 69 72 72 65 76 6f 63 61 62 6c 79  s.** irrevocably
2d5c0 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a   committed..**.*
2d5d0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
2d5e0 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f  curs, an IO erro
2d5f0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
2d600 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 72  ed and the pager
2d610 0a 2a 2a 20 6d 6f 76 65 73 20 69 6e 74 6f 20 74  .** moves into t
2d620 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20  he error state. 
2d630 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
2d640 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2d650 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2d660 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
2d670 54 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65  Two(Pager *pPage
2d680 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
2d690 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2d6a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2d6b0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
2d6c0 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
2d6d0 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61  should not be ca
2d6e0 6c 6c 65 64 20 69 66 20 61 20 70 72 69 6f 72 20  lled if a prior 
2d6f0 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
2d700 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20 69 66 20  ed..  ** But if 
2d710 28 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67  (due to a coding
2d720 20 65 72 72 6f 72 20 65 6c 73 65 77 68 65 72 65   error elsewhere
2d730 20 69 6e 20 74 68 65 20 73 79 73 74 65 6d 29 20   in the system) 
2d740 69 74 20 64 6f 65 73 20 67 65 74 0a 20 20 2a 2a  it does get.  **
2d750 20 63 61 6c 6c 65 64 2c 20 6a 75 73 74 20 72 65   called, just re
2d760 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 65 72  turn the same er
2d770 72 6f 72 20 63 6f 64 65 20 77 69 74 68 6f 75 74  ror code without
2d780 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e   doing anything.
2d790 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
2d7a0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
2d7b0 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72   ) return pPager
2d7c0 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a  ->errCode;..  /*
2d7d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
2d7e0 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c  hould not be cal
2d7f0 6c 65 64 20 69 66 20 74 68 65 20 70 61 67 65 72  led if the pager
2d800 20 69 73 20 6e 6f 74 20 69 6e 20 61 74 20 6c 65   is not in at le
2d810 61 73 74 0a 20 20 2a 2a 20 50 41 47 45 52 5f 52  ast.  ** PAGER_R
2d820 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 41  ESERVED state. A
2d830 6e 64 20 69 6e 64 65 65 64 20 53 51 4c 69 74 65  nd indeed SQLite
2d840 20 6e 65 76 65 72 20 64 6f 65 73 20 74 68 69 73   never does this
2d850 2e 20 42 75 74 20 69 74 20 69 73 0a 20 20 2a 2a  . But it is.  **
2d860 20 6e 69 63 65 20 74 6f 20 68 61 76 65 20 74 68   nice to have th
2d870 69 73 20 64 65 66 65 6e 73 69 76 65 20 74 65 73  is defensive tes
2d880 74 20 68 65 72 65 20 61 6e 79 77 61 79 2e 0a 20  t here anyway.. 
2d890 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
2d8a0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
2d8b0 47 45 52 5f 52 45 53 45 52 56 45 44 29 20 29 20  GER_RESERVED) ) 
2d8c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2d8d0 52 4f 52 3b 0a 0a 20 20 2f 2a 20 41 6e 20 6f 70  ROR;..  /* An op
2d8e0 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 49 66 20 74  timization. If t
2d8f0 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
2d900 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64  not actually mod
2d910 69 66 69 65 64 20 64 75 72 69 6e 67 0a 20 20 2a  ified during.  *
2d920 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  * this transacti
2d930 6f 6e 2c 20 74 68 65 20 70 61 67 65 72 20 69 73  on, the pager is
2d940 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
2d950 75 73 69 76 65 2d 6d 6f 64 65 20 61 6e 64 20 69  usive-mode and i
2d960 73 0a 20 20 2a 2a 20 75 73 69 6e 67 20 70 65 72  s.  ** using per
2d970 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  sistent journals
2d980 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
2d990 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
2d9a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73  .  **.  ** The s
2d9b0 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
2d9c0 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74  nal file current
2d9d0 6c 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69  ly contains a si
2d9e0 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20  ngle journal .  
2d9f0 2a 2a 20 68 65 61 64 65 72 20 77 69 74 68 20 74  ** header with t
2da00 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 73 65  he nRec field se
2da10 74 20 74 6f 20 30 2e 20 49 66 20 73 75 63 68 20  t to 0. If such 
2da20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75 73 65  a journal is use
2da30 64 20 61 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d  d as.  ** a hot-
2da40 6a 6f 75 72 6e 61 6c 20 64 75 72 69 6e 67 20 68  journal during h
2da50 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
2da60 61 63 6b 2c 20 30 20 63 68 61 6e 67 65 73 20 77  ack, 0 changes w
2da70 69 6c 6c 20 62 65 20 6d 61 64 65 0a 20 20 2a 2a  ill be made.  **
2da80 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2da90 20 66 69 6c 65 2e 20 53 6f 20 74 68 65 72 65 20   file. So there 
2daa0 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 7a 65  is no need to ze
2dab0 72 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  ro the journal .
2dac0 20 20 2a 2a 20 68 65 61 64 65 72 2e 20 53 69 6e    ** header. Sin
2dad0 63 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ce the pager is 
2dae0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
2daf0 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  e, there is no n
2db00 65 65 64 0a 20 20 2a 2a 20 74 6f 20 64 72 6f 70  eed.  ** to drop
2db10 20 61 6e 79 20 6c 6f 63 6b 73 20 65 69 74 68 65   any locks eithe
2db20 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  r..  */.  if( pP
2db30 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
2db40 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ==0 && pPager->e
2db50 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20  xclusiveMode .  
2db60 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
2db70 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
2db80 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
2db90 53 54 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65  ST.  ){.    asse
2dba0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
2dbb0 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
2dbc0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
2dbd0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2dbe0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50  ITE_OK;.  }..  P
2dbf0 41 47 45 52 54 52 41 43 45 28 28 22 43 4f 4d 4d  AGERTRACE(("COMM
2dc00 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IT %d\n", PAGERI
2dc10 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 61  D(pPager)));.  a
2dc20 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2dc30 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43  tate==PAGER_SYNC
2dc40 45 44 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 21  ED || MEMDB || !
2dc50 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
2dc60 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67  ed );.  rc = pag
2dc70 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
2dc80 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  on(pPager, pPage
2dc90 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20  r->setMaster);. 
2dca0 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
2dcb0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
2dcc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
2dcd0 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20  ck all changes. 
2dce0 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c  The database fal
2dcf0 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  ls back to PAGER
2dd00 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a  _SHARED mode..**
2dd10 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2dd20 6e 20 70 65 72 66 6f 72 6d 73 20 74 77 6f 20 74  n performs two t
2dd30 61 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  asks:.**.**   1)
2dd40 20 49 74 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74   It rolls back t
2dd50 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
2dd60 20 72 65 73 74 6f 72 69 6e 67 20 61 6c 6c 20 64   restoring all d
2dd70 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
2dd80 20 0a 2a 2a 20 20 20 20 20 20 69 6e 2d 6d 65 6d   .**      in-mem
2dd90 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20  ory cache pages 
2dda0 74 6f 20 74 68 65 20 73 74 61 74 65 20 74 68 65  to the state the
2ddb0 79 20 77 65 72 65 20 69 6e 20 77 68 65 6e 20 74  y were in when t
2ddc0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  he transaction.*
2ddd0 2a 20 20 20 20 20 20 77 61 73 20 6f 70 65 6e 65  *      was opene
2dde0 64 2c 20 61 6e 64 0a 2a 2a 20 20 20 32 29 20 49  d, and.**   2) I
2ddf0 74 20 66 69 6e 61 6c 69 7a 65 73 20 74 68 65 20  t finalizes the 
2de00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 6f  journal file, so
2de10 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
2de20 75 73 65 64 20 66 6f 72 20 68 6f 74 0a 2a 2a 20  used for hot.** 
2de30 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 61 74       rollback at
2de40 20 61 6e 79 20 70 6f 69 6e 74 20 69 6e 20 74 68   any point in th
2de50 65 20 66 75 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  e future..**.** 
2de60 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 66  subject to the f
2de70 6f 6c 6c 6f 77 69 6e 67 20 71 75 61 6c 69 66 69  ollowing qualifi
2de80 63 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 2a  cations:.**.** *
2de90 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
2dea0 66 69 6c 65 20 69 73 20 6e 6f 74 20 79 65 74 20  file is not yet 
2deb0 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66  open when this f
2dec0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2ded0 64 2c 0a 2a 2a 20 20 20 74 68 65 6e 20 6f 6e 6c  d,.**   then onl
2dee0 79 20 28 32 29 20 69 73 20 70 65 72 66 6f 72 6d  y (2) is perform
2def0 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
2df00 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6a 6f 75   there is no jou
2df10 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 74  rnal file.**   t
2df20 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a 2a 2a 0a  o roll back..**.
2df30 2a 2a 20 2a 20 49 66 20 69 6e 20 61 6e 20 65 72  ** * If in an er
2df40 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72 20  ror state other 
2df50 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  than SQLITE_FULL
2df60 2c 20 74 68 65 6e 20 74 61 73 6b 20 28 31 29 20  , then task (1) 
2df70 69 73 20 0a 2a 2a 20 20 20 70 65 72 66 6f 72 6d  is .**   perform
2df80 65 64 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  ed. If successfu
2df90 6c 2c 20 74 61 73 6b 20 28 32 29 2e 20 52 65 67  l, task (2). Reg
2dfa0 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f  ardless of the o
2dfb0 75 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f 66 20 65  utcome.**   of e
2dfc0 69 74 68 65 72 2c 20 74 68 65 20 65 72 72 6f 72  ither, the error
2dfd0 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64   state error cod
2dfe0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
2dff0 20 74 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20   the caller.**  
2e000 20 28 69 2e 65 2e 20 65 69 74 68 65 72 20 53 51   (i.e. either SQ
2e010 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51  LITE_IOERR or SQ
2e020 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a  LITE_CORRUPT)..*
2e030 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20 70 61  *.** * If the pa
2e040 67 65 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f  ger is in PAGER_
2e050 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
2e060 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28 31 29  then attempt (1)
2e070 2e 20 57 68 65 74 68 65 72 0a 2a 2a 20 20 20 6f  . Whether.**   o
2e080 72 20 6e 6f 74 20 28 31 29 20 69 73 20 73 75 63  r not (1) is suc
2e090 63 75 73 73 66 75 6c 2c 20 61 6c 73 6f 20 61 74  cussful, also at
2e0a0 74 65 6d 70 74 20 28 32 29 2e 20 49 66 20 73 75  tempt (2). If su
2e0b0 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
2e0c0 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 4f 4b 2e  .**   SQLITE_OK.
2e0d0 20 4f 74 68 65 72 77 69 73 65 2c 20 65 6e 74 65   Otherwise, ente
2e0e0 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
2e0f0 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  e and return the
2e100 20 66 69 72 73 74 20 0a 2a 2a 20 20 20 65 72 72   first .**   err
2e110 6f 72 20 63 6f 64 65 20 65 6e 63 6f 75 6e 74 65  or code encounte
2e120 72 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49 6e  red. .**.**   In
2e130 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
2e140 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
2e150 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
2e160 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f 2e 20  was written to. 
2e170 0a 2a 2a 20 20 20 53 6f 20 69 73 20 73 61 66 65  .**   So is safe
2e180 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
2e190 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 76   journal file ev
2e1a0 65 6e 20 69 66 20 74 68 65 20 70 6c 61 79 62 61  en if the playba
2e1b0 63 6b 20 0a 2a 2a 20 20 20 28 6f 70 65 72 61 74  ck .**   (operat
2e1c0 69 6f 6e 20 31 29 20 66 61 69 6c 65 64 2e 20 48  ion 1) failed. H
2e1d0 6f 77 65 76 65 72 20 74 68 65 20 70 61 67 65 72  owever the pager
2e1e0 20 6d 75 73 74 20 65 6e 74 65 72 20 74 68 65 20   must enter the 
2e1f0 65 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a 20 20  error state.**  
2e200 20 61 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   as the contents
2e210 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   of the in-memor
2e220 79 20 63 61 63 68 65 20 61 72 65 20 6e 6f 77 20  y cache are now 
2e230 73 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 2a  suspect..**.** *
2e240 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 69 6e 20   Finally, if in 
2e250 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
2e260 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74 74 65  state, then atte
2e270 6d 70 74 20 28 31 29 2e 20 4f 6e 6c 79 0a 2a 2a  mpt (1). Only.**
2e280 20 20 20 61 74 74 65 6d 70 74 20 28 32 29 20 69     attempt (2) i
2e290 66 20 28 31 29 20 69 73 20 73 75 63 63 65 73 73  f (1) is success
2e2a0 66 75 6c 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ful. Return SQLI
2e2b0 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
2e2c0 66 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68 65 72 77  ful,.**   otherw
2e2d0 69 73 65 20 65 6e 74 65 72 20 74 68 65 20 65 72  ise enter the er
2e2e0 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20 72 65  ror state and re
2e2f0 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63  turn the error c
2e300 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a  ode from the .**
2e310 20 20 20 66 61 69 6c 69 6e 67 20 6f 70 65 72 61     failing opera
2e320 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e  tion..**.**   In
2e330 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 64   this case the d
2e340 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61 79  atabase file may
2e350 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
2e360 65 6e 20 74 6f 2e 20 53 6f 20 69 66 20 74 68 65  en to. So if the
2e370 0a 2a 2a 20 20 20 70 6c 61 79 62 61 63 6b 20 6f  .**   playback o
2e380 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74  peration did not
2e390 20 73 75 63 63 65 65 64 20 69 74 20 77 6f 75 6c   succeed it woul
2e3a0 64 20 6e 6f 74 20 62 65 20 73 61 66 65 20 74 6f  d not be safe to
2e3b0 20 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20 20 74   finalize.**   t
2e3c0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
2e3d0 20 49 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   It needs to be 
2e3e0 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
2e3f0 2d 73 79 73 74 65 6d 20 73 6f 20 74 68 61 74 0a  -system so that.
2e400 2a 2a 20 20 20 73 6f 6d 65 20 6f 74 68 65 72 20  **   some other 
2e410 70 72 6f 63 65 73 73 20 63 61 6e 20 75 73 65 20  process can use 
2e420 69 74 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  it to restore th
2e430 65 20 64 61 74 61 62 61 73 65 20 73 74 61 74 65  e database state
2e440 20 28 62 79 0a 2a 2a 20 20 20 68 6f 74 2d 6a 6f   (by.**   hot-jo
2e450 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e  urnal rollback).
2e460 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2e470 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67  agerRollback(Pag
2e480 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2e490 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2e4a0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
2e4b0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2e4c0 64 65 20 2a 2f 0a 20 20 50 41 47 45 52 54 52 41  de */.  PAGERTRA
2e4d0 43 45 28 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64  CE(("ROLLBACK %d
2e4e0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
2e4f0 67 65 72 29 29 29 3b 0a 20 20 69 66 28 20 21 70  ger)));.  if( !p
2e500 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
2e510 64 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61  d || !isOpen(pPa
2e520 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
2e530 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
2e540 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
2e550 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  er, pPager->setM
2e560 61 73 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20  aster);.  }else 
2e570 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
2e580 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
2e590 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46  rrCode!=SQLITE_F
2e5a0 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ULL ){.    if( p
2e5b0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
2e5c0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  GER_EXCLUSIVE ){
2e5d0 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61  .      pager_pla
2e5e0 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29  yback(pPager, 0)
2e5f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
2e600 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2e610 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
2e620 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
2e630 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
2e640 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
2e650 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  2;.      rc = pa
2e660 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
2e670 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ger, 0);.      r
2e680 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  c2 = pager_end_t
2e690 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
2e6a0 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  r, pPager->setMa
2e6b0 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ster);.      if(
2e6c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2e6d0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  {.        rc = r
2e6e0 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c2;.      }.    
2e6f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2e700 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
2e710 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
2e720 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d 45 4d   }..    if( !MEM
2e730 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  DB ){.      pPag
2e740 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
2e750 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
2e760 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
2e770 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 52  ccurs during a R
2e780 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20  OLLBACK, we can 
2e790 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20  no longer trust 
2e7a0 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
2e7b0 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20   cache. So call 
2e7c0 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e  pager_error() on
2e7d0 20 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20   the way out to 
2e7e0 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a  make any error .
2e7f0 20 20 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e      ** persisten
2e800 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  t..    */.    rc
2e810 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70   = pager_error(p
2e820 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d 0a  Pager, rc);.  }.
2e830 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2e840 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
2e850 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  E if the databas
2e860 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  e file is opened
2e870 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74   read-only.  Ret
2e880 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20  urn FALSE.** if 
2e890 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
2e8a0 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74  (in theory) writ
2e8b0 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69  able..*/.u8 sqli
2e8c0 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
2e8d0 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ly(Pager *pPager
2e8e0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
2e8f0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a  er->readOnly;.}.
2e900 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2e910 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
2e920 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
2e930 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
2e940 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
2e950 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2e960 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2e970 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
2e980 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2e990 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2e9a0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
2e9b0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
2e9c0 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
2e9d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2e9e0 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
2e9f0 74 28 44 62 50 61 67 65 20 2a 70 50 61 67 65 29  t(DbPage *pPage)
2ea00 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
2ea10 65 33 50 63 61 63 68 65 50 61 67 65 52 65 66 63  e3PcachePageRefc
2ea20 6f 75 6e 74 28 70 50 61 67 65 29 3b 0a 7d 0a 0a  ount(pPage);.}..
2ea30 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
2ea40 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ST./*.** This ro
2ea50 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
2ea60 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
2ea70 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  alysis only..*/.
2ea80 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67 65  int *sqlite3Page
2ea90 72 53 74 61 74 73 28 50 61 67 65 72 20 2a 70 50  rStats(Pager *pP
2eaa0 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20  ager){.  static 
2eab0 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30  int a[11];.  a[0
2eac0 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  ] = sqlite3Pcach
2ead0 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
2eae0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b  ->pPCache);.  a[
2eaf0 31 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  1] = sqlite3Pcac
2eb00 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
2eb10 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
2eb20 61 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33 50 63  a[2] = sqlite3Pc
2eb30 61 63 68 65 47 65 74 43 61 63 68 65 73 69 7a 65  acheGetCachesize
2eb40 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2eb50 29 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67  );.  a[3] = pPag
2eb60 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
2eb70 3f 20 28 69 6e 74 29 20 70 50 61 67 65 72 2d 3e  ? (int) pPager->
2eb80 64 62 53 69 7a 65 20 3a 20 2d 31 3b 0a 20 20 61  dbSize : -1;.  a
2eb90 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  [4] = pPager->st
2eba0 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50  ate;.  a[5] = pP
2ebb0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
2ebc0 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[6] = pPager->
2ebd0 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70  nHit;.  a[7] = p
2ebe0 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20  Pager->nMiss;.  
2ebf0 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73  a[8] = 0;  /* Us
2ec00 65 64 20 74 6f 20 62 65 20 70 50 61 67 65 72 2d  ed to be pPager-
2ec10 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d  >nOvfl */.  a[9]
2ec20 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64   = pPager->nRead
2ec30 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67  ;.  a[10] = pPag
2ec40 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65  er->nWrite;.  re
2ec50 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66  turn a;.}.#endif
2ec60 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2ec70 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2ec80 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  n in-memory page
2ec90 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
2eca0 33 50 61 67 65 72 49 73 4d 65 6d 64 62 28 50 61  3PagerIsMemdb(Pa
2ecb0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2ecc0 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a  return MEMDB;.}.
2ecd0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61  ./*.** Check tha
2ece0 74 20 74 68 65 72 65 20 61 72 65 20 61 74 20 6c  t there are at l
2ecf0 65 61 73 74 20 6e 53 61 76 65 70 6f 69 6e 74 20  east nSavepoint 
2ed00 73 61 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2e  savepoints open.
2ed10 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a   If there are.**
2ed20 20 63 75 72 72 65 6e 74 6c 79 20 6c 65 73 73 20   currently less 
2ed30 74 68 61 6e 20 6e 53 61 76 65 70 6f 69 6e 74 73  than nSavepoints
2ed40 20 6f 70 65 6e 2c 20 74 68 65 6e 20 6f 70 65 6e   open, then open
2ed50 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76   one or more sav
2ed60 65 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 6d 61  epoints.** to ma
2ed70 6b 65 20 75 70 20 74 68 65 20 64 69 66 66 65 72  ke up the differ
2ed80 65 6e 63 65 2e 20 49 66 20 74 68 65 20 6e 75 6d  ence. If the num
2ed90 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74  ber of savepoint
2eda0 73 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20  s is already.** 
2edb0 65 71 75 61 6c 20 74 6f 20 6e 53 61 76 65 70 6f  equal to nSavepo
2edc0 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66  int, then this f
2edd0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
2ede0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  op..**.** If a m
2edf0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
2ee00 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e   fails, SQLITE_N
2ee10 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
2ee20 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a  . If an error .*
2ee30 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f  * occurs while o
2ee40 70 65 6e 69 6e 67 20 74 68 65 20 73 75 62 2d 6a  pening the sub-j
2ee50 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
2ee60 6e 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  n an IO error co
2ee70 64 65 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  de is.** returne
2ee80 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  d. Otherwise, SQ
2ee90 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
2eea0 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
2eeb0 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20  Savepoint(Pager 
2eec0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 53 61  *pPager, int nSa
2eed0 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20  vepoint){.  int 
2eee0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2eef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef00 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2ef10 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  code */.  int nC
2ef20 75 72 72 65 6e 74 20 3d 20 70 50 61 67 65 72 2d  urrent = pPager-
2ef30 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20  >nSavepoint;    
2ef40 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e      /* Current n
2ef50 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69  umber of savepoi
2ef60 6e 74 73 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 53  nts */..  if( nS
2ef70 61 76 65 70 6f 69 6e 74 3e 6e 43 75 72 72 65 6e  avepoint>nCurren
2ef80 74 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65  t && pPager->use
2ef90 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69  Journal ){.    i
2efa0 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
2efb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2efc0 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
2efd0 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
2efe0 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
2eff0 74 20 2a 61 4e 65 77 3b 20 20 20 20 20 20 20 20  t *aNew;        
2f000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
2f010 77 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  w Pager.aSavepoi
2f020 6e 74 20 61 72 72 61 79 20 2a 2f 0a 0a 20 20 20  nt array */..   
2f030 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 72 65   /* Either there
2f040 20 69 73 20 6e 6f 20 61 63 74 69 76 65 20 6a 6f   is no active jo
2f050 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 73 75 62  urnal or the sub
2f060 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e  -journal is open
2f070 20 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   or .    ** the 
2f080 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77 61 79  journal is alway
2f090 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f  s stored in memo
2f0a0 72 79 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ry */.    assert
2f0b0 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  ( pPager->nSavep
2f0c0 6f 69 6e 74 3d 3d 30 20 7c 7c 20 69 73 4f 70 65  oint==0 || isOpe
2f0d0 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
2f0e0 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ||.            p
2f0f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2f100 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
2f110 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a  LMODE_MEMORY );.
2f120 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65  .    /* Grow the
2f130 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
2f140 74 20 61 72 72 61 79 20 75 73 69 6e 67 20 72 65  t array using re
2f150 61 6c 6c 6f 63 28 29 2e 20 52 65 74 75 72 6e 20  alloc(). Return 
2f160 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 20  SQLITE_NOMEM.   
2f170 20 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f 63   ** if the alloc
2f180 61 74 69 6f 6e 20 66 61 69 6c 73 2e 20 4f 74 68  ation fails. Oth
2f190 65 72 77 69 73 65 2c 20 7a 65 72 6f 20 74 68 65  erwise, zero the
2f1a0 20 6e 65 77 20 70 6f 72 74 69 6f 6e 20 69 6e 20   new portion in 
2f1b0 63 61 73 65 20 61 20 0a 20 20 20 20 2a 2a 20 6d  case a .    ** m
2f1c0 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
2f1d0 63 75 72 73 20 77 68 69 6c 65 20 70 6f 70 75 6c  curs while popul
2f1e0 61 74 69 6e 67 20 69 74 20 69 6e 20 74 68 65 20  ating it in the 
2f1f0 66 6f 72 28 2e 2e 2e 29 20 6c 6f 6f 70 20 62 65  for(...) loop be
2f200 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  low..    */.    
2f210 61 4e 65 77 20 3d 20 28 50 61 67 65 72 53 61 76  aNew = (PagerSav
2f220 65 70 6f 69 6e 74 20 2a 29 73 71 6c 69 74 65 33  epoint *)sqlite3
2f230 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  Realloc(.       
2f240 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
2f250 69 6e 74 2c 20 73 69 7a 65 6f 66 28 50 61 67 65  int, sizeof(Page
2f260 72 53 61 76 65 70 6f 69 6e 74 29 2a 6e 53 61 76  rSavepoint)*nSav
2f270 65 70 6f 69 6e 74 0a 20 20 20 20 29 3b 0a 20 20  epoint.    );.  
2f280 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b 0a 20    if( !aNew ){. 
2f290 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2f2a0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
2f2b0 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77      memset(&aNew
2f2c0 5b 6e 43 75 72 72 65 6e 74 5d 2c 20 30 2c 20 28  [nCurrent], 0, (
2f2d0 6e 53 61 76 65 70 6f 69 6e 74 2d 6e 43 75 72 72  nSavepoint-nCurr
2f2e0 65 6e 74 29 20 2a 20 73 69 7a 65 6f 66 28 50 61  ent) * sizeof(Pa
2f2f0 67 65 72 53 61 76 65 70 6f 69 6e 74 29 29 3b 0a  gerSavepoint));.
2f300 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76      pPager->aSav
2f310 65 70 6f 69 6e 74 20 3d 20 61 4e 65 77 3b 0a 20  epoint = aNew;. 
2f320 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65     pPager->nSave
2f330 70 6f 69 6e 74 20 3d 20 6e 53 61 76 65 70 6f 69  point = nSavepoi
2f340 6e 74 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75  nt;..    /* Popu
2f350 6c 61 74 65 20 74 68 65 20 50 61 67 65 72 53 61  late the PagerSa
2f360 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72  vepoint structur
2f370 65 73 20 6a 75 73 74 20 61 6c 6c 6f 63 61 74 65  es just allocate
2f380 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 69  d. */.    for(ii
2f390 3d 6e 43 75 72 72 65 6e 74 3b 20 69 69 3c 6e 53  =nCurrent; ii<nS
2f3a0 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
2f3b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2f3c0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
2f3d0 69 64 20 29 3b 0a 20 20 20 20 20 20 61 4e 65 77  id );.      aNew
2f3e0 5b 69 69 5d 2e 6e 4f 72 69 67 20 3d 20 70 50 61  [ii].nOrig = pPa
2f3f0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
2f400 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
2f410 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50  ager->jfd) && pP
2f420 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2f430 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 4e  >0 ){.        aN
2f440 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d  ew[ii].iOffset =
2f450 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2f460 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Off;.      }else
2f470 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69  {.        aNew[i
2f480 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 4a 4f 55  i].iOffset = JOU
2f490 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
2f4a0 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
2f4b0 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 53 75 62     aNew[ii].iSub
2f4c0 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53  Rec = pPager->nS
2f4d0 75 62 52 65 63 3b 0a 20 20 20 20 20 20 61 4e 65  ubRec;.      aNe
2f4e0 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  w[ii].pInSavepoi
2f4f0 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
2f500 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d  ecCreate(pPager-
2f510 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  >dbSize);.      
2f520 69 66 28 20 21 61 4e 65 77 5b 69 69 5d 2e 70 49  if( !aNew[ii].pI
2f530 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  nSavepoint ){.  
2f540 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2f550 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
2f560 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
2f570 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f   Open the sub-jo
2f580 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20  urnal, if it is 
2f590 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
2f5a0 65 64 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ed. */.    rc = 
2f5b0 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70  openSubJournal(p
2f5c0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72  Pager);.  }..  r
2f5d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2f5e0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2f5f0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f   is called to ro
2f600 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65 61 73  llback or releas
2f610 65 20 28 63 6f 6d 6d 69 74 29 20 61 20 73 61 76  e (commit) a sav
2f620 65 70 6f 69 6e 74 2e 0a 2a 2a 20 54 68 65 20 73  epoint..** The s
2f630 61 76 65 70 6f 69 6e 74 20 74 6f 20 72 65 6c 65  avepoint to rele
2f640 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
2f650 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68 65 20  need not be the 
2f660 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 0a 2a  most recently .*
2f670 2a 20 63 72 65 61 74 65 64 20 73 61 76 65 70 6f  * created savepo
2f680 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  int..**.** Param
2f690 65 74 65 72 20 6f 70 20 69 73 20 61 6c 77 61 79  eter op is alway
2f6a0 73 20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49  s either SAVEPOI
2f6b0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 20 53  NT_ROLLBACK or S
2f6c0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
2f6d0 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 53 41  ..** If it is SA
2f6e0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
2f6f0 20 74 68 65 6e 20 72 65 6c 65 61 73 65 20 61 6e   then release an
2f700 64 20 64 65 73 74 72 6f 79 20 74 68 65 20 73 61  d destroy the sa
2f710 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 2a 2a 20  vepoint with.** 
2f720 69 6e 64 65 78 20 69 53 61 76 65 70 6f 69 6e 74  index iSavepoint
2f730 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50  . If it is SAVEP
2f740 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
2f750 68 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 61 6c 6c  hen rollback all
2f760 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 61 74   changes.** that
2f770 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 73   have occurred s
2f780 69 6e 63 65 20 74 68 65 20 73 70 65 63 69 66 69  ince the specifi
2f790 65 64 20 73 61 76 65 70 6f 69 6e 74 20 77 61 73  ed savepoint was
2f7a0 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   created..**.** 
2f7b0 54 68 65 20 73 61 76 65 70 6f 69 6e 74 20 74 6f  The savepoint to
2f7c0 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c   rollback or rel
2f7d0 65 61 73 65 20 69 73 20 69 64 65 6e 74 69 66 69  ease is identifi
2f7e0 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
2f7f0 0a 2a 2a 20 69 53 61 76 65 70 6f 69 6e 74 2e 20  .** iSavepoint. 
2f800 41 20 76 61 6c 75 65 20 6f 66 20 30 20 6d 65 61  A value of 0 mea
2f810 6e 73 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  ns to operate on
2f820 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73   the outermost s
2f830 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 28 74 68 65  avepoint.** (the
2f840 20 66 69 72 73 74 20 63 72 65 61 74 65 64 29 2e   first created).
2f850 20 41 20 76 61 6c 75 65 20 6f 66 20 28 50 61 67   A value of (Pag
2f860 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29  er.nSavepoint-1)
2f870 20 6d 65 61 6e 73 20 6f 70 65 72 61 74 65 0a 2a   means operate.*
2f880 2a 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  * on the most re
2f890 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 73  cently created s
2f8a0 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 53 61  avepoint. If iSa
2f8b0 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74  vepoint is great
2f8c0 65 72 20 74 68 61 6e 0a 2a 2a 20 28 50 61 67 65  er than.** (Page
2f8d0 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29 2c  r.nSavepoint-1),
2f8e0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
2f8f0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
2f900 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 65 67 61 74  **.** If a negat
2f910 69 76 65 20 76 61 6c 75 65 20 69 73 20 70 61 73  ive value is pas
2f920 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
2f930 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 63  tion, then the c
2f940 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  urrent.** transa
2f950 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
2f960 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69  back. This is di
2f970 66 66 65 72 65 6e 74 20 74 6f 20 63 61 6c 6c 69  fferent to calli
2f980 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  ng .** sqlite3Pa
2f990 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65  gerRollback() be
2f9a0 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63 74  cause this funct
2f9b0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 74 65 72  ion does not ter
2f9c0 6d 69 6e 61 74 65 0a 2a 2a 20 74 68 65 20 74 72  minate.** the tr
2f9d0 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 75 6e 6c  ansaction or unl
2f9e0 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
2f9f0 2c 20 69 74 20 6a 75 73 74 20 72 65 73 74 6f 72  , it just restor
2fa00 65 73 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  es the .** conte
2fa10 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
2fa20 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
2fa30 6e 61 6c 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a  nal state. .**.*
2fa40 2a 20 49 6e 20 61 6e 79 20 63 61 73 65 2c 20 61  * In any case, a
2fa50 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69  ll savepoints wi
2fa60 74 68 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61  th an index grea
2fa70 74 65 72 20 74 68 61 6e 20 69 53 61 76 65 70 6f  ter than iSavepo
2fa80 69 6e 74 20 0a 2a 2a 20 61 72 65 20 64 65 73 74  int .** are dest
2fa90 72 6f 79 65 64 2e 20 49 66 20 74 68 69 73 20 69  royed. If this i
2faa0 73 20 61 20 72 65 6c 65 61 73 65 20 6f 70 65 72  s a release oper
2fab0 61 74 69 6f 6e 20 28 6f 70 3d 3d 53 41 56 45 50  ation (op==SAVEP
2fac0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 2c 0a 2a  OINT_RELEASE),.*
2fad0 2a 20 74 68 65 6e 20 73 61 76 65 70 6f 69 6e 74  * then savepoint
2fae0 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 61   iSavepoint is a
2faf0 6c 73 6f 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a  lso destroyed..*
2fb00 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2fb10 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  on may return SQ
2fb20 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20  LITE_NOMEM if a 
2fb30 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
2fb40 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 6f 72 20 61  n fails,.** or a
2fb50 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
2fb60 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
2fb70 63 63 75 72 73 20 77 68 69 6c 65 20 72 6f 6c 6c  ccurs while roll
2fb80 69 6e 67 20 62 61 63 6b 20 61 20 0a 2a 2a 20 73  ing back a .** s
2fb90 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 6e 6f 20  avepoint. If no 
2fba0 65 72 72 6f 72 73 20 6f 63 63 75 72 2c 20 53 51  errors occur, SQ
2fbb0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2fbc0 6e 65 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c  ned..*/ .int sql
2fbd0 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69  ite3PagerSavepoi
2fbe0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
2fbf0 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53  , int op, int iS
2fc00 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74  avepoint){.  int
2fc10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2fc20 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  ..  assert( op==
2fc30 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
2fc40 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49  E || op==SAVEPOI
2fc50 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20  NT_ROLLBACK );. 
2fc60 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f   assert( iSavepo
2fc70 69 6e 74 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 53 41  int>=0 || op==SA
2fc80 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
2fc90 20 29 3b 0a 0a 20 20 69 66 28 20 69 53 61 76 65   );..  if( iSave
2fca0 70 6f 69 6e 74 3c 70 50 61 67 65 72 2d 3e 6e 53  point<pPager->nS
2fcb0 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
2fcc0 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
2fcd0 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
2fce0 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69  ariable */.    i
2fcf0 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20  nt nNew;        
2fd00 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
2fd10 65 6d 61 69 6e 69 6e 67 20 73 61 76 65 70 6f 69  emaining savepoi
2fd20 6e 74 73 20 61 66 74 65 72 20 74 68 69 73 20 6f  nts after this o
2fd30 70 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69  p. */..    /* Fi
2fd40 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
2fd50 79 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69 6c  y savepoints wil
2fd60 6c 20 73 74 69 6c 6c 20 62 65 20 61 63 74 69 76  l still be activ
2fd70 65 20 61 66 74 65 72 20 74 68 69 73 0a 20 20 20  e after this.   
2fd80 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53   ** operation. S
2fd90 74 6f 72 65 20 74 68 69 73 20 76 61 6c 75 65 20  tore this value 
2fda0 69 6e 20 6e 4e 65 77 2e 20 54 68 65 6e 20 66 72  in nNew. Then fr
2fdb0 65 65 20 72 65 73 6f 75 72 63 65 73 20 61 73 73  ee resources ass
2fdc0 6f 63 69 61 74 65 64 20 0a 20 20 20 20 2a 2a 20  ociated .    ** 
2fdd0 77 69 74 68 20 61 6e 79 20 73 61 76 65 70 6f 69  with any savepoi
2fde0 6e 74 73 20 74 68 61 74 20 61 72 65 20 64 65 73  nts that are des
2fdf0 74 72 6f 79 65 64 20 62 79 20 74 68 69 73 20 6f  troyed by this o
2fe00 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  peration..    */
2fe10 0a 20 20 20 20 6e 4e 65 77 20 3d 20 69 53 61 76  .    nNew = iSav
2fe20 65 70 6f 69 6e 74 20 2b 20 28 6f 70 3d 3d 53 41  epoint + (op==SA
2fe30 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
2fe40 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e 4e  );.    for(ii=nN
2fe50 65 77 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  ew; ii<pPager->n
2fe60 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
2fe70 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
2fe80 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
2fe90 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
2fea0 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  ii].pInSavepoint
2feb0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
2fec0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  ger->nSavepoint 
2fed0 3d 20 6e 4e 65 77 3b 0a 0a 20 20 20 20 2f 2a 20  = nNew;..    /* 
2fee0 49 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c  If this is a rol
2fef0 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2c  lback operation,
2ff00 20 70 6c 61 79 62 61 63 6b 20 74 68 65 20 73 70   playback the sp
2ff10 65 63 69 66 69 65 64 20 73 61 76 65 70 6f 69 6e  ecified savepoin
2ff20 74 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69  t..    ** If thi
2ff30 73 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  s is a temp-file
2ff40 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
2ff50 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
2ff60 6c 20 66 69 6c 65 20 68 61 73 0a 20 20 20 20 2a  l file has.    *
2ff70 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  * not yet been o
2ff80 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63  pened. In this c
2ff90 61 73 65 20 74 68 65 72 65 20 68 61 76 65 20 62  ase there have b
2ffa0 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74  een no changes t
2ffb0 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  o.    ** the dat
2ffc0 61 62 61 73 65 20 66 69 6c 65 2c 20 73 6f 20 74  abase file, so t
2ffd0 68 65 20 70 6c 61 79 62 61 63 6b 20 6f 70 65 72  he playback oper
2ffe0 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 73 6b 69  ation can be ski
2fff0 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  pped..    */.   
30000 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49   if( op==SAVEPOI
30010 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 26 26 20 69  NT_ROLLBACK && i
30020 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
30030 64 29 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65  d) ){.      Page
30040 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76  rSavepoint *pSav
30050 65 70 6f 69 6e 74 20 3d 20 28 6e 4e 65 77 3d 3d  epoint = (nNew==
30060 30 29 3f 30 3a 26 70 50 61 67 65 72 2d 3e 61 53  0)?0:&pPager->aS
30070 61 76 65 70 6f 69 6e 74 5b 6e 4e 65 77 2d 31 5d  avepoint[nNew-1]
30080 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
30090 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
300a0 69 6e 74 28 70 50 61 67 65 72 2c 20 70 53 61 76  int(pPager, pSav
300b0 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 61  epoint);.      a
300c0 73 73 65 72 74 28 72 63 21 3d 53 51 4c 49 54 45  ssert(rc!=SQLITE
300d0 5f 44 4f 4e 45 29 3b 0a 20 20 20 20 7d 0a 20 20  _DONE);.    }.  
300e0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
300f0 69 73 20 61 20 72 65 6c 65 61 73 65 20 6f 66 20  is a release of 
30100 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73 61  the outermost sa
30110 76 65 70 6f 69 6e 74 2c 20 74 72 75 6e 63 61 74  vepoint, truncat
30120 65 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75  e .    ** the su
30130 62 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 7a 65 72  b-journal to zer
30140 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  o bytes in size.
30150 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4e 65 77   */.    if( nNew
30160 3d 3d 30 20 26 26 20 6f 70 3d 3d 53 41 56 45 50  ==0 && op==SAVEP
30170 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 26 26 20  OINT_RELEASE && 
30180 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
30190 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73  jfd) ){.      as
301a0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
301b0 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 63 20  _OK );.      rc 
301c0 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
301d0 61 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  ate(pPager->sjfd
301e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 67  , 0);.      pPag
301f0 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b  er->nSubRec = 0;
30200 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
30210 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
30220 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
30230 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
30240 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
30250 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
30260 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e  qlite3PagerFilen
30270 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
30280 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
30290 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a  ger->zFilename;.
302a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
302b0 74 68 65 20 56 46 53 20 73 74 72 75 63 74 75 72  the VFS structur
302c0 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e  e for the pager.
302d0 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65  .*/.const sqlite
302e0 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 50 61  3_vfs *sqlite3Pa
302f0 67 65 72 56 66 73 28 50 61 67 65 72 20 2a 70 50  gerVfs(Pager *pP
30300 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
30310 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a  pPager->pVfs;.}.
30320 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
30330 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f  e file handle fo
30340 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
30350 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  ile associated.*
30360 2a 20 77 69 74 68 20 74 68 65 20 70 61 67 65 72  * with the pager
30370 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 72 65  .  This might re
30380 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
30390 20 66 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74   file has.** not
303a0 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
303b0 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c  ..*/.sqlite3_fil
303c0 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46  e *sqlite3PagerF
303d0 69 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ile(Pager *pPage
303e0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
303f0 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  ger->fd;.}../*.*
30400 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
30410 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
30420 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
30430 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
30440 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
30450 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  alname(Pager *pP
30460 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
30470 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
30480 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
30490 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28  n true if fsync(
304a0 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61  ) calls are disa
304b0 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61  bled for this pa
304c0 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  ger.  Return FAL
304d0 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29  SE.** if fsync()
304e0 73 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e  s are executed n
304f0 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  ormally..*/.int 
30500 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
30510 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
30520 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
30530 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23  er->noSync;.}..#
30540 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
30550 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74  _CODEC./*.** Set
30560 20 6f 72 20 72 65 74 72 69 65 76 65 20 74 68 65   or retrieve the
30570 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20   codec for this 
30580 70 61 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20  pager.*/.static 
30590 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
305a0 72 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67  rSetCodec(.  Pag
305b0 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f  er *pPager,.  vo
305c0 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f  id *(*xCodec)(vo
305d0 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
305e0 6e 74 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43  nt),.  void (*xC
305f0 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f  odecSizeChng)(vo
30600 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 2c 0a 20 20  id*,int,int),.  
30610 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65  void (*xCodecFre
30620 65 29 28 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69  e)(void*),.  voi
30630 64 20 2a 70 43 6f 64 65 63 0a 29 7b 0a 20 20 69  d *pCodec.){.  i
30640 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
30650 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e  cFree ) pPager->
30660 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65  xCodecFree(pPage
30670 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 20 20 70 50  r->pCodec);.  pP
30680 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78  ager->xCodec = x
30690 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d  Codec;.  pPager-
306a0 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20  >xCodecSizeChng 
306b0 3d 20 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67  = xCodecSizeChng
306c0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  ;.  pPager->xCod
306d0 65 63 46 72 65 65 20 3d 20 78 43 6f 64 65 63 46  ecFree = xCodecF
306e0 72 65 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  ree;.  pPager->p
306f0 43 6f 64 65 63 20 3d 20 70 43 6f 64 65 63 3b 0a  Codec = pCodec;.
30700 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a    pagerReportSiz
30710 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a 73 74 61  e(pPager);.}.sta
30720 74 69 63 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  tic void *sqlite
30730 33 50 61 67 65 72 47 65 74 43 6f 64 65 63 28 50  3PagerGetCodec(P
30740 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
30750 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
30760 70 43 6f 64 65 63 3b 0a 7d 0a 23 65 6e 64 69 66  pCodec;.}.#endif
30770 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
30780 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
30790 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
307a0 70 61 67 65 20 70 50 67 20 74 6f 20 6c 6f 63 61  page pPg to loca
307b0 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65  tion pgno in the
307c0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
307d0 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65  re must be no re
307e0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
307f0 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20  page previously 
30800 6c 6f 63 61 74 65 64 20 61 74 0a 2a 2a 20 70 67  located at.** pg
30810 6e 6f 20 28 77 68 69 63 68 20 77 65 20 63 61 6c  no (which we cal
30820 6c 20 70 50 67 4f 6c 64 29 20 74 68 6f 75 67 68  l pPgOld) though
30830 20 74 68 61 74 20 70 61 67 65 20 69 73 20 61 6c   that page is al
30840 6c 6f 77 65 64 20 74 6f 20 62 65 0a 2a 2a 20 69  lowed to be.** i
30850 6e 20 63 61 63 68 65 2e 20 20 49 66 20 74 68 65  n cache.  If the
30860 20 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79   page previously
30870 20 6c 6f 63 61 74 65 64 20 61 74 20 70 67 6e 6f   located at pgno
30880 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
30890 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ** in the rollba
308a0 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69  ck journal, it i
308b0 73 20 6e 6f 74 20 70 75 74 20 74 68 65 72 65 20  s not put there 
308c0 62 79 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  by by this routi
308d0 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65  ne..**.** Refere
308e0 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
308f0 20 70 50 67 20 72 65 6d 61 69 6e 20 76 61 6c 69   pPg remain vali
30900 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a  d. Updating any.
30910 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73  ** meta-data ass
30920 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50 67  ociated with pPg
30930 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72   (i.e. data stor
30940 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61  ed in the nExtra
30950 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61   bytes.** alloca
30960 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  ted along with t
30970 68 65 20 70 61 67 65 29 20 69 73 20 74 68 65 20  he page) is the 
30980 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
30990 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  f the caller..**
309a0 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f  .** A transactio
309b0 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69 76 65  n must be active
309c0 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
309d0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74  ne is called. It
309e0 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72   used to be.** r
309f0 65 71 75 69 72 65 64 20 74 68 61 74 20 61 20 73  equired that a s
30a00 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
30a10 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74  tion was not act
30a20 69 76 65 2c 20 62 75 74 20 74 68 69 73 20 72 65  ive, but this re
30a30 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73  striction.** has
30a40 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43   been removed (C
30a50 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64  REATE INDEX need
30a60 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65  s to move a page
30a70 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e   when a statemen
30a80 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
30a90 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a 2a 0a   is active)..**.
30aa0 2a 2a 20 49 66 20 74 68 65 20 66 6f 75 72 74 68  ** If the fourth
30ab0 20 61 72 67 75 6d 65 6e 74 2c 20 69 73 43 6f 6d   argument, isCom
30ac0 6d 69 74 2c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  mit, is non-zero
30ad0 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65  , then this page
30ae0 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 6d 6f 76   is being.** mov
30af0 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  ed as part of a 
30b00 64 61 74 61 62 61 73 65 20 72 65 6f 72 67 61 6e  database reorgan
30b10 69 7a 61 74 69 6f 6e 20 6a 75 73 74 20 62 65 66  ization just bef
30b20 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
30b30 69 6f 6e 20 0a 2a 2a 20 69 73 20 62 65 69 6e 67  ion .** is being
30b40 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 6e 20 74   committed. In t
30b50 68 69 73 20 63 61 73 65 2c 20 69 74 20 69 73 20  his case, it is 
30b60 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
30b70 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67  the database pag
30b80 65 20 0a 2a 2a 20 70 50 67 20 72 65 66 65 72 73  e .** pPg refers
30b90 20 74 6f 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   to will not be 
30ba0 77 72 69 74 74 65 6e 20 74 6f 20 61 67 61 69 6e  written to again
30bb0 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61   within this tra
30bc0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
30bd0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
30be0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
30bf0 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65  NOMEM or an IO e
30c00 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20  rror code if an 
30c10 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e  error.** occurs.
30c20 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72   Otherwise, it r
30c30 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
30c40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
30c50 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 50 61  PagerMovepage(Pa
30c60 67 65 72 20 2a 70 50 61 67 65 72 2c 20 44 62 50  ger *pPager, DbP
30c70 61 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70  age *pPg, Pgno p
30c80 67 6e 6f 2c 20 69 6e 74 20 69 73 43 6f 6d 6d 69  gno, int isCommi
30c90 74 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  t){.  PgHdr *pPg
30ca0 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  Old;            
30cb0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 62     /* The page b
30cc0 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e  eing overwritten
30cd0 2e 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 65 64  . */.  Pgno need
30ce0 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 20 20 20  SyncPgno = 0;   
30cf0 20 20 20 20 2f 2a 20 4f 6c 64 20 76 61 6c 75 65      /* Old value
30d00 20 6f 66 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 69   of pPg->pgno, i
30d10 66 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72  f sync is requir
30d20 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ed */.  int rc; 
30d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d40 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
30d50 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 72  ode */.  Pgno or
30d60 69 67 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  igPgno;         
30d70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 72 69        /* The ori
30d80 67 69 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  ginal page numbe
30d90 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
30da0 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a  pPg->nRef>0 );..
30db0 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
30dc0 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 69 73 20   being moved is 
30dd0 64 69 72 74 79 20 61 6e 64 20 68 61 73 20 6e 6f  dirty and has no
30de0 74 20 62 65 65 6e 20 73 61 76 65 64 20 62 79 20  t been saved by 
30df0 74 68 65 20 6c 61 74 65 73 74 0a 20 20 2a 2a 20  the latest.  ** 
30e00 73 61 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e 20  savepoint, then 
30e10 73 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  save the current
30e20 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
30e30 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 0a   page into the .
30e40 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c    ** sub-journal
30e50 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 72 65   now. This is re
30e60 71 75 69 72 65 64 20 74 6f 20 68 61 6e 64 6c 65  quired to handle
30e70 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
30e80 63 65 6e 61 72 69 6f 3a 0a 20 20 2a 2a 0a 20 20  cenario:.  **.  
30e90 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a  **   BEGIN;.  **
30ea0 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61       <journal pa
30eb0 67 65 20 58 2c 20 74 68 65 6e 20 6d 6f 64 69 66  ge X, then modif
30ec0 79 20 69 74 20 69 6e 20 6d 65 6d 6f 72 79 3e 0a  y it in memory>.
30ed0 20 20 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49    **     SAVEPOI
30ee0 4e 54 20 6f 6e 65 3b 0a 20 20 2a 2a 20 20 20 20  NT one;.  **    
30ef0 20 20 20 3c 4d 6f 76 65 20 70 61 67 65 20 58 20     <Move page X 
30f00 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 59 3e 0a 20  to location Y>. 
30f10 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b   **     ROLLBACK
30f20 20 54 4f 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20   TO one;.  **.  
30f30 2a 2a 20 49 66 20 70 61 67 65 20 58 20 77 65 72  ** If page X wer
30f40 65 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f  e not written to
30f50 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
30f60 20 68 65 72 65 2c 20 69 74 20 77 6f 75 6c 64 20   here, it would 
30f70 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 70 6f 73 73  not.  ** be poss
30f80 69 62 6c 65 20 74 6f 20 72 65 73 74 6f 72 65 20  ible to restore 
30f90 69 74 73 20 63 6f 6e 74 65 6e 74 73 20 77 68 65  its contents whe
30fa0 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20  n the "ROLLBACK 
30fb0 54 4f 20 6f 6e 65 22 0a 20 20 2a 2a 20 73 74 61  TO one".  ** sta
30fc0 74 65 6d 65 6e 74 20 77 65 72 65 20 69 73 20 70  tement were is p
30fd0 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2a 0a 20  rocessed..  **. 
30fe0 20 2a 2a 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61   ** subjournalPa
30ff0 67 65 28 29 20 6d 61 79 20 6e 65 65 64 20 74 6f  ge() may need to
31000 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
31010 74 6f 20 73 74 6f 72 65 20 70 50 67 2d 3e 70 67  to store pPg->pg
31020 6e 6f 20 69 6e 74 6f 0a 20 20 2a 2a 20 6f 6e 65  no into.  ** one
31030 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69   or more savepoi
31040 6e 74 20 62 69 74 76 65 63 73 2e 20 54 68 69 73  nt bitvecs. This
31050 20 69 73 20 74 68 65 20 72 65 61 73 6f 6e 20 74   is the reason t
31060 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  his function.  *
31070 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  * may return SQL
31080 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 20 20 2a 2f 0a  ITE_NOMEM..  */.
31090 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73    if( pPg->flags
310a0 26 50 47 48 44 52 5f 44 49 52 54 59 20 0a 20 20  &PGHDR_DIRTY .  
310b0 20 26 26 20 73 75 62 6a 52 65 71 75 69 72 65 73   && subjRequires
310c0 50 61 67 65 28 70 50 67 29 0a 20 20 20 26 26 20  Page(pPg).   && 
310d0 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
310e0 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
310f0 70 50 67 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  pPg)).  ){.    r
31100 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
31110 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4d 4f   PAGERTRACE(("MO
31120 56 45 20 25 64 20 70 61 67 65 20 25 64 20 28 6e  VE %d page %d (n
31130 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65  eedSync=%d) move
31140 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20  s to %d\n", .   
31150 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
31160 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28  r), pPg->pgno, (
31170 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
31180 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 2c  _NEED_SYNC)?1:0,
31190 20 70 67 6e 6f 29 29 3b 0a 20 20 49 4f 54 52 41   pgno));.  IOTRA
311a0 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20  CE(("MOVE %p %d 
311b0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
311c0 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29  Pg->pgno, pgno))
311d0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f  ..  /* If the jo
311e0 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62  urnal needs to b
311f0 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  e sync()ed befor
31200 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f  e page pPg->pgno
31210 20 63 61 6e 0a 20 20 2a 2a 20 62 65 20 77 72 69   can.  ** be wri
31220 74 74 65 6e 20 74 6f 2c 20 73 74 6f 72 65 20 70  tten to, store p
31230 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 6c 6f 63 61  Pg->pgno in loca
31240 6c 20 76 61 72 69 61 62 6c 65 20 6e 65 65 64 53  l variable needS
31250 79 6e 63 50 67 6e 6f 2e 0a 20 20 2a 2a 0a 20 20  yncPgno..  **.  
31260 2a 2a 20 49 66 20 74 68 65 20 69 73 43 6f 6d 6d  ** If the isComm
31270 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  it flag is set, 
31280 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
31290 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61   to remember tha
312a0 74 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  t.  ** the journ
312b0 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  al needs to be s
312c0 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64  ync()ed before d
312d0 61 74 61 62 61 73 65 20 70 61 67 65 20 70 50 67  atabase page pPg
312e0 2d 3e 70 67 6e 6f 20 0a 20 20 2a 2a 20 63 61 6e  ->pgno .  ** can
312f0 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   be written to. 
31300 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  The caller has a
31310 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20  lready promised 
31320 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20  not to write to 
31330 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  it..  */.  if( (
31340 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
31350 5f 4e 45 45 44 5f 53 59 4e 43 29 20 26 26 20 21  _NEED_SYNC) && !
31360 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  isCommit ){.    
31370 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70  needSyncPgno = p
31380 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73  Pg->pgno;.    as
31390 73 65 72 74 28 20 70 61 67 65 49 6e 4a 6f 75 72  sert( pageInJour
313a0 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70 50 67 2d  nal(pPg) || pPg-
313b0 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
313c0 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20  OrigSize );.    
313d0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
313e0 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
313f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
31400 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
31410 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
31420 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e  he cache contain
31430 73 20 61 20 70 61 67 65 20 77 69 74 68 20 70 61  s a page with pa
31440 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20  ge-number pgno, 
31450 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66  remove it.  ** f
31460 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 68 61  rom its hash cha
31470 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65  in. Also, if the
31480 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
31490 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a  was set for .  *
314a0 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f  * page pgno befo
314b0 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70  re the 'move' op
314c0 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64  eration, it need
314d0 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64  s to be retained
314e0 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70   .  ** for the p
314f0 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e  age moved there.
31500 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61  .  */.  pPg->fla
31510 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45  gs &= ~PGHDR_NEE
31520 44 5f 53 59 4e 43 3b 0a 20 20 70 50 67 4f 6c 64  D_SYNC;.  pPgOld
31530 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
31540 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
31550 20 61 73 73 65 72 74 28 20 21 70 50 67 4f 6c 64   assert( !pPgOld
31560 20 7c 7c 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66   || pPgOld->nRef
31570 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 50 67  ==1 );.  if( pPg
31580 4f 6c 64 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  Old ){.    pPg->
31590 66 6c 61 67 73 20 7c 3d 20 28 70 50 67 4f 6c 64  flags |= (pPgOld
315a0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
315b0 45 44 5f 53 59 4e 43 29 3b 0a 20 20 20 20 73 71  ED_SYNC);.    sq
315c0 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
315d0 70 50 67 4f 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20  pPgOld);.  }..  
315e0 6f 72 69 67 50 67 6e 6f 20 3d 20 70 50 67 2d 3e  origPgno = pPg->
315f0 70 67 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 50  pgno;.  sqlite3P
31600 63 61 63 68 65 4d 6f 76 65 28 70 50 67 2c 20 70  cacheMove(pPg, p
31610 67 6e 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  gno);.  sqlite3P
31620 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70  cacheMakeDirty(p
31630 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  Pg);.  pPager->d
31640 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 0a  bModified = 1;..
31650 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67    if( needSyncPg
31660 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  no ){.    /* If 
31670 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20  needSyncPgno is 
31680 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
31690 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
316a0 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20  needs to be .   
316b0 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66   ** sync()ed bef
316c0 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
316d0 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62  written to datab
316e0 61 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65  ase file page ne
316f0 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20  edSyncPgno..    
31700 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f  ** Currently, no
31710 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74   such page exist
31720 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61  s in the page-ca
31730 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20  che and the .   
31740 20 2a 2a 20 22 69 73 20 6a 6f 75 72 6e 61 6c 65   ** "is journale
31750 64 22 20 62 69 74 76 65 63 20 66 6c 61 67 20 68  d" bitvec flag h
31760 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69  as been set. Thi
31770 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  s needs to be re
31780 6d 65 64 69 65 64 20 62 79 0a 20 20 20 20 2a 2a  medied by.    **
31790 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 70 61 67   loading the pag
317a0 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72  e into the pager
317b0 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74 69  -cache and setti
317c0 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  ng the PgHdr.nee
317d0 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 66 6c  dSync .    ** fl
317e0 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ag..    **.    *
317f0 2a 20 49 66 20 74 68 65 20 61 74 74 65 6d 70 74  * If the attempt
31800 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 70 61 67   to load the pag
31810 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 2d  e into the page-
31820 63 61 63 68 65 20 66 61 69 6c 73 2c 20 28 64 75  cache fails, (du
31830 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61 20 6d 61  e.    ** to a ma
31840 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66 61 69  lloc() or IO fai
31850 6c 75 72 65 29 2c 20 63 6c 65 61 72 20 74 68 65  lure), clear the
31860 20 62 69 74 20 69 6e 20 74 68 65 20 70 49 6e 4a   bit in the pInJ
31870 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20  ournal[].    ** 
31880 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65  array. Otherwise
31890 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  , if the page is
318a0 20 6c 6f 61 64 65 64 20 61 6e 64 20 77 72 69 74   loaded and writ
318b0 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a 20 20 20  ten again in.   
318c0 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63   ** this transac
318d0 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20 62 65 20  tion, it may be 
318e0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
318f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66  atabase file bef
31900 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74 20 69 73  ore.    ** it is
31910 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65   synced into the
31920 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
31930 68 69 73 20 77 61 79 2c 20 69 74 20 6d 61 79 20  his way, it may 
31940 65 6e 64 20 75 70 20 69 6e 0a 20 20 20 20 2a 2a  end up in.    **
31950 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
31960 65 20 74 77 69 63 65 2c 20 62 75 74 20 74 68 61  e twice, but tha
31970 74 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c  t is not a probl
31980 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  em..    **.    *
31990 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50 61 67  * The sqlite3Pag
319a0 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d 61 79  erGet() call may
319b0 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e   cause the journ
319c0 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d  al to sync. So m
319d0 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20  ake.    ** sure 
319e0 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79  the Pager.needSy
319f0 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  nc flag is set t
31a00 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 50  oo..    */.    P
31a10 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20  gHdr *pPgHdr;.  
31a20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
31a30 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20  ->needSync );.  
31a40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
31a50 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 6e  gerGet(pPager, n
31a60 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50  eedSyncPgno, &pP
31a70 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72  gHdr);.    if( r
31a80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
31a90 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 53 79        if( needSy
31aa0 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ncPgno<=pPager->
31ab0 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20  dbOrigSize ){.  
31ac0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
31ad0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 21  ager->pTmpSpace!
31ae0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =0 );.        sq
31af0 6c 69 74 65 33 42 69 74 76 65 63 43 6c 65 61 72  lite3BitvecClear
31b00 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
31b10 6e 61 6c 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e  nal, needSyncPgn
31b20 6f 2c 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  o, pPager->pTmpS
31b30 70 61 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pace);.      }. 
31b40 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
31b50 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
31b60 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
31b70 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
31b80 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26 26  er->noSync==0 &&
31b90 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70   !MEMDB );.    p
31ba0 50 67 48 64 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  PgHdr->flags |= 
31bb0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
31bc0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
31bd0 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 48  heMakeDirty(pPgH
31be0 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  dr);.    sqlite3
31bf0 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64  PagerUnref(pPgHd
31c00 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  r);.  }..  /*.  
31c10 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ** For an in-mem
31c20 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6d 61  ory database, ma
31c30 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72 69 67  ke sure the orig
31c40 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 69 6e  inal page contin
31c50 75 65 73 0a 20 20 2a 2a 20 74 6f 20 65 78 69 73  ues.  ** to exis
31c60 74 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 74  t, in case the t
31c70 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73  ransaction needs
31c80 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20   to roll back.  
31c90 57 65 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a  We allocate.  **
31ca0 20 74 68 65 20 70 61 67 65 20 6e 6f 77 2c 20 69   the page now, i
31cb0 6e 73 74 65 61 64 20 6f 66 20 61 74 20 72 6f 6c  nstead of at rol
31cc0 6c 62 61 63 6b 2c 20 62 65 63 61 75 73 65 20 77  lback, because w
31cd0 65 20 63 61 6e 20 62 65 74 74 65 72 20 64 65 61  e can better dea
31ce0 6c 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e 20 6f  l.  ** with an o
31cf0 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72  ut-of-memory err
31d00 6f 72 20 6e 6f 77 2e 20 20 54 69 63 6b 65 74 20  or now.  Ticket 
31d10 23 33 37 36 31 2e 0a 20 20 2a 2f 0a 20 20 69 66  #3761..  */.  if
31d20 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 44  ( MEMDB ){.    D
31d30 62 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20  bPage *pNew;.   
31d40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
31d50 65 72 41 63 71 75 69 72 65 28 70 50 61 67 65 72  erAcquire(pPager
31d60 2c 20 6f 72 69 67 50 67 6e 6f 2c 20 26 70 4e 65  , origPgno, &pNe
31d70 77 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72  w, 1);.    if( r
31d80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
31d90 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
31da0 63 68 65 4d 6f 76 65 28 70 50 67 2c 20 6f 72 69  cheMove(pPg, ori
31db0 67 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65  gPgno);.      re
31dc0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
31dd0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
31de0 6e 72 65 66 28 70 4e 65 77 29 3b 0a 20 20 7d 0a  nref(pNew);.  }.
31df0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
31e00 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
31e10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
31e20 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 61 74  inter to the dat
31e30 61 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66  a for the specif
31e40 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69  ied page..*/.voi
31e50 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47  d *sqlite3PagerG
31e60 65 74 44 61 74 61 28 44 62 50 61 67 65 20 2a 70  etData(DbPage *p
31e70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  Pg){.  assert( p
31e80 50 67 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 50  Pg->nRef>0 || pP
31e90 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  g->pPager->memDb
31ea0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67   );.  return pPg
31eb0 2d 3e 70 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->pData;.}../*.*
31ec0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
31ed0 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 2e  er to the Pager.
31ee0 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20  nExtra bytes of 
31ef0 22 65 78 74 72 61 22 20 73 70 61 63 65 20 0a 2a  "extra" space .*
31f00 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e  * allocated alon
31f10 67 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  g with the speci
31f20 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f  fied page..*/.vo
31f30 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
31f40 47 65 74 45 78 74 72 61 28 44 62 50 61 67 65 20  GetExtra(DbPage 
31f50 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
31f60 70 50 67 2d 3e 70 45 78 74 72 61 3b 0a 7d 0a 0a  pPg->pExtra;.}..
31f70 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68  /*.** Get/set th
31f80 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66  e locking-mode f
31f90 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50  or this pager. P
31fa0 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d  arameter eMode m
31fb0 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66  ust be one.** of
31fc0 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
31fd0 44 45 5f 51 55 45 52 59 2c 20 50 41 47 45 52 5f  DE_QUERY, PAGER_
31fe0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
31ff0 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f  AL or .** PAGER_
32000 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
32010 55 53 49 56 45 2e 20 49 66 20 74 68 65 20 70 61  USIVE. If the pa
32020 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f  rameter is not _
32030 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74  QUERY, then.** t
32040 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20  he locking-mode 
32050 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
32060 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a  lue specified..*
32070 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
32080 64 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65  d value is eithe
32090 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  r PAGER_LOCKINGM
320a0 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a  ODE_NORMAL or.**
320b0 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
320c0 44 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 69 6e  DE_EXCLUSIVE, in
320d0 64 69 63 61 74 69 6e 67 20 74 68 65 20 63 75 72  dicating the cur
320e0 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75  rent (possibly u
320f0 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69  pdated).** locki
32100 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  ng-mode..*/.int 
32110 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b  sqlite3PagerLock
32120 69 6e 67 4d 6f 64 65 28 50 61 67 65 72 20 2a 70  ingMode(Pager *p
32130 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65  Pager, int eMode
32140 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f  ){.  assert( eMo
32150 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
32160 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20  GMODE_QUERY.    
32170 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
32180 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
32190 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20  ODE_NORMAL.     
321a0 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
321b0 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
321c0 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  DE_EXCLUSIVE );.
321d0 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
321e0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52  LOCKINGMODE_QUER
321f0 59 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Y<0 );.  assert(
32200 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
32210 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20  DE_NORMAL>=0 && 
32220 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
32230 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30 20 29  E_EXCLUSIVE>=0 )
32240 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30  ;.  if( eMode>=0
32250 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
32260 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61  pFile ){.    pPa
32270 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
32280 64 65 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a  de = (u8)eMode;.
32290 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e    }.  return (in
322a0 74 29 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  t)pPager->exclus
322b0 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  iveMode;.}../*.*
322c0 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 6a 6f  * Get/set the jo
322d0 75 72 6e 61 6c 2d 6d 6f 64 65 20 66 6f 72 20 74  urnal-mode for t
322e0 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d  his pager. Param
322f0 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20  eter eMode must 
32300 62 65 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a  be one of:.**.**
32310 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41      PAGER_JOURNA
32320 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 2a 2a 20 20  LMODE_QUERY.**  
32330 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d    PAGER_JOURNALM
32340 4f 44 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20  ODE_DELETE.**   
32350 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
32360 44 45 5f 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20  DE_TRUNCATE.**  
32370 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d    PAGER_JOURNALM
32380 4f 44 45 5f 50 45 52 53 49 53 54 0a 2a 2a 20 20  ODE_PERSIST.**  
32390 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d    PAGER_JOURNALM
323a0 4f 44 45 5f 4f 46 46 0a 2a 2a 20 20 20 20 50 41  ODE_OFF.**    PA
323b0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
323c0 4d 45 4d 4f 52 59 0a 2a 2a 0a 2a 2a 20 49 66 20  MEMORY.**.** If 
323d0 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  the parameter is
323e0 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65   not _QUERY, the
323f0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  n the journal_mo
32400 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  de is set to the
32410 0a 2a 2a 20 76 61 6c 75 65 20 73 70 65 63 69 66  .** value specif
32420 69 65 64 20 69 66 20 74 68 65 20 63 68 61 6e 67  ied if the chang
32430 65 20 69 73 20 61 6c 6c 6f 77 65 64 2e 20 20 54  e is allowed.  T
32440 68 65 20 63 68 61 6e 67 65 20 69 73 20 64 69 73  he change is dis
32450 61 6c 6c 6f 77 65 64 0a 2a 2a 20 66 6f 72 20 74  allowed.** for t
32460 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 61  he following rea
32470 73 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  sons:.**.**   * 
32480 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   An in-memory da
32490 74 61 62 61 73 65 20 63 61 6e 20 6f 6e 6c 79 20  tabase can only 
324a0 68 61 76 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c  have its journal
324b0 5f 6d 6f 64 65 20 73 65 74 20 74 6f 20 5f 4f 46  _mode set to _OF
324c0 46 0a 2a 2a 20 20 20 20 20 20 6f 72 20 5f 4d 45  F.**      or _ME
324d0 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  MORY..**.**   * 
324e0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64   The journal mod
324f0 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 68 61  e may not be cha
32500 6e 67 65 64 20 77 68 69 6c 65 20 61 20 74 72 61  nged while a tra
32510 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
32520 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ve..**.** The re
32530 74 75 72 6e 65 64 20 69 6e 64 69 63 61 74 65 20  turned indicate 
32540 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73  the current (pos
32550 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 20 6a  sibly updated) j
32560 6f 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a  ournal-mode..*/.
32570 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
32580 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65  JournalMode(Page
32590 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
325a0 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Mode){.  assert(
325b0 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
325c0 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a  URNALMODE_QUERY.
325d0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
325e0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
325f0 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 20  NALMODE_DELETE. 
32600 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
32610 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
32620 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a  ALMODE_TRUNCATE.
32630 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
32640 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
32650 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a  NALMODE_PERSIST.
32660 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
32670 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
32680 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
32690 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
326a0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
326b0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20  MODE_MEMORY );. 
326c0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a   assert( PAGER_J
326d0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59  OURNALMODE_QUERY
326e0 3c 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64  <0 );.  if( eMod
326f0 65 3e 3d 30 0a 20 20 20 26 26 20 28 21 4d 45 4d  e>=0.   && (!MEM
32700 44 42 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47  DB || eMode==PAG
32710 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
32720 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20 20  EMORY .         
32730 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
32740 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
32750 5f 4f 46 46 29 0a 20 20 20 26 26 20 21 70 50 61  _OFF).   && !pPa
32760 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 0a  ger->dbModified.
32770 20 20 20 26 26 20 28 21 69 73 4f 70 65 6e 28 70     && (!isOpen(p
32780 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 30  Pager->jfd) || 0
32790 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
327a0 6c 4f 66 66 29 0a 20 20 29 7b 0a 20 20 20 20 69  lOff).  ){.    i
327b0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
327c0 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
327d0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
327e0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
327f0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a   }.    pPager->j
32800 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 28 75 38  ournalMode = (u8
32810 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65  )eMode;.  }.  re
32820 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72  turn (int)pPager
32830 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d  ->journalMode;.}
32840 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20  ../*.** Get/set 
32850 74 68 65 20 73 69 7a 65 2d 6c 69 6d 69 74 20 75  the size-limit u
32860 73 65 64 20 66 6f 72 20 70 65 72 73 69 73 74 65  sed for persiste
32870 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nt journal files
32880 2e 0a 2a 2a 0a 2a 2a 20 53 65 74 74 69 6e 67 20  ..**.** Setting 
32890 74 68 65 20 73 69 7a 65 20 6c 69 6d 69 74 20 74  the size limit t
328a0 6f 20 2d 31 20 6d 65 61 6e 73 20 6e 6f 20 6c 69  o -1 means no li
328b0 6d 69 74 20 69 73 20 65 6e 66 6f 72 63 65 64 2e  mit is enforced.
328c0 0a 2a 2a 20 41 6e 20 61 74 74 65 6d 70 74 20 74  .** An attempt t
328d0 6f 20 73 65 74 20 61 20 6c 69 6d 69 74 20 73 6d  o set a limit sm
328e0 61 6c 6c 65 72 20 74 68 61 6e 20 2d 31 20 69 73  aller than -1 is
328f0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 36 34   a no-op..*/.i64
32900 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75   sqlite3PagerJou
32910 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 28 50 61  rnalSizeLimit(Pa
32920 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 36 34  ger *pPager, i64
32930 20 69 4c 69 6d 69 74 29 7b 0a 20 20 69 66 28 20   iLimit){.  if( 
32940 69 4c 69 6d 69 74 3e 3d 2d 31 20 29 7b 0a 20 20  iLimit>=-1 ){.  
32950 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
32960 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 69 4c 69  lSizeLimit = iLi
32970 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  mit;.  }.  retur
32980 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  n pPager->journa
32990 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 2f  lSizeLimit;.}../
329a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
329b0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 50 61  inter to the pPa
329c0 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 76 61 72  ger->pBackup var
329d0 69 61 62 6c 65 2e 20 54 68 65 20 62 61 63 6b 75  iable. The backu
329e0 70 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69 6e 20 62  p module.** in b
329f0 61 63 6b 75 70 2e 63 20 6d 61 69 6e 74 61 69 6e  ackup.c maintain
32a00 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  s the content of
32a10 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 2e 20   this variable. 
32a20 54 68 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20 75  This module.** u
32a30 73 65 73 20 69 74 20 6f 70 61 71 75 65 6c 79 20  ses it opaquely 
32a40 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74  as an argument t
32a50 6f 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52  o sqlite3BackupR
32a60 65 73 74 61 72 74 28 29 20 61 6e 64 0a 2a 2a 20  estart() and.** 
32a70 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
32a80 61 74 65 28 29 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73  ate() only..*/.s
32a90 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 2a  qlite3_backup **
32aa0 73 71 6c 69 74 65 33 50 61 67 65 72 42 61 63 6b  sqlite3PagerBack
32ab0 75 70 50 74 72 28 50 61 67 65 72 20 2a 70 50 61  upPtr(Pager *pPa
32ac0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 26  ger){.  return &
32ad0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 3b  pPager->pBackup;
32ae0 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
32af0 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
32b00 20 2a 2f 0a                                       */.