/ Hex Artifact Content
Login

Artifact 5fee0ea97b1bd12a97006d64ddc9224f83fdbfde:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 35 39  : pager.c,v 1.59
0350: 34 20 32 30 30 39 2f 30 36 2f 31 38 20 31 37 3a  4 2009/06/18 17:
0360: 32 32 3a 33 39 20 64 72 68 20 45 78 70 20 24 0a  22:39 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: 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72    memcpy(zHeader
7690: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
76a0: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
76b0: 4d 61 67 69 63 29 29 3b 0a 0a 20 20 2f 2a 20 0a  Magic));..  /* .
76c0: 20 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e    ** Write the n
76d0: 52 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20  Rec Field - the 
76e0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
76f0: 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c  ecords that foll
7700: 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75  ow this.  ** jou
7710: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72  rnal header. Nor
7720: 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77  mally, zero is w
7730: 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76  ritten to this v
7740: 61 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d  alue at this tim
7750: 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68  e..  ** After th
7760: 65 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64  e records are ad
7770: 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ded to the journ
7780: 61 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72  al (and the jour
7790: 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a  nal synced, .  *
77a0: 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * if in full-syn
77b0: 63 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72  c mode), the zer
77c0: 6f 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e  o is overwritten
77d0: 20 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e   with the true n
77e0: 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65  umber.  ** of re
77f0: 63 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a  cords (see syncJ
7800: 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a  ournal())..  **.
7810: 20 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c    ** A faster al
7820: 74 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20  ternative is to 
7830: 77 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46  write 0xFFFFFFFF
7840: 20 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65   to the nRec fie
7850: 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65  ld. When.  ** re
7860: 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ading the journa
7870: 6c 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c  l this value tel
7880: 6c 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73  ls SQLite to ass
7890: 75 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a  ume that the.  *
78a0: 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  * rest of the jo
78b0: 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61  urnal file conta
78c0: 69 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72  ins valid page r
78d0: 65 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73  ecords. This ass
78e0: 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  umption.  ** is 
78f0: 64 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66  dangerous, as if
7900: 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
7910: 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69  red whilst writi
7920: 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
7930: 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d  l.  ** file it m
7940: 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20  ay contain some 
7950: 67 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68  garbage data. Th
7960: 65 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e  ere are two scen
7970: 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65  arios.  ** where
7980: 20 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62   this risk can b
7990: 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a  e ignored:.  **.
79a0: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
79b0: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f  e pager is in no
79c0: 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72  -sync mode. Corr
79d0: 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f  uption can follo
79e0: 77 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77  w a.  **     pow
79f0: 65 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68  er failure in th
7a00: 69 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a  is case anyway..
7a10: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68    **.  **   * Wh
7a20: 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  en the SQLITE_IO
7a30: 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20  CAP_SAFE_APPEND 
7a40: 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69  flag is set. Thi
7a50: 73 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a  s guarantees.  *
7a60: 2a 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61  *     that garba
7a70: 67 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72  ge data is never
7a80: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
7a90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
7aa0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
7ab0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
7ac0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79   || pPager->noSy
7ad0: 6e 63 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61  nc );.  if( (pPa
7ae0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 20 7c 7c 20  ger->noSync) || 
7af0: 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
7b00: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
7b10: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a  NALMODE_MEMORY).
7b20: 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73     || (sqlite3Os
7b30: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
7b40: 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
7b50: 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
7b60: 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29  AFE_APPEND) .  )
7b70: 7b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28  {.    put32bits(
7b80: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
7b90: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c  aJournalMagic)],
7ba0: 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
7bb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 75 74 33 32  }else{.    put32
7bc0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
7bd0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
7be0: 69 63 29 5d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  ic)], 0);.  }.. 
7bf0: 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63   /* The random c
7c00: 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61  heck-hash initia
7c10: 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69  liser */ .  sqli
7c20: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
7c30: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b  izeof(pPager->ck
7c40: 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65  sumInit), &pPage
7c50: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
7c60: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
7c70: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
7c80: 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50  nalMagic)+4], pP
7c90: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
7ca0: 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69  ;.  /* The initi
7cb0: 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  al database size
7cc0: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
7cd0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
7ce0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38  aJournalMagic)+8
7cf0: 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  ], pPager->dbOri
7d00: 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65  gSize);.  /* The
7d10: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
7d20: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
7d30: 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32  ocess */.  put32
7d40: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
7d50: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
7d60: 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d  ic)+12], pPager-
7d70: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20  >sectorSize);.. 
7d80: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a   /* The page siz
7d90: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
7da0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
7db0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
7dc0: 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  16], pPager->pag
7dd0: 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e  eSize);..  /* In
7de0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74  itializing the t
7df0: 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65  ail of the buffe
7e00: 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  r is not necessa
7e10: 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a  ry.  Everything.
7e20: 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20    ** works find 
7e30: 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
7e40: 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69   memset() is omi
7e50: 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69  tted.  But initi
7e60: 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65  alizing.  ** the
7e70: 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73   memory prevents
7e80: 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63   valgrind from c
7e90: 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77  omplaining, so w
7ea0: 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f  e are willing to
7eb0: 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70  .  ** take the p
7ec0: 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a  erformance hit..
7ed0: 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a    */.  memset(&z
7ee0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
7ef0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d  ournalMagic)+20]
7f00: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48  , 0,.         nH
7f10: 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a  eader-(sizeof(aJ
7f20: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29  ournalMagic)+20)
7f30: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f  );..  /* In theo
7f40: 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e  ry, it is only n
7f50: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
7f60: 65 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74  e the 28 bytes t
7f70: 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f  hat the .  ** jo
7f80: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e  urnal header con
7f90: 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75  sumes to the jou
7fa0: 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20  rnal file here. 
7fb0: 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74  Then increment t
7fc0: 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a  he .  ** Pager.j
7fd0: 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62  ournalOff variab
7fe0: 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44  le by JOURNAL_HD
7ff0: 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65  R_SZ so that the
8000: 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f   next .  ** reco
8010: 72 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  rd is written to
8020: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
8030: 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61  ector (leaving a
8040: 20 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65   gap in the file
8050: 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20  .  ** that will 
8060: 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69  be implicitly fi
8070: 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f  lled in by the O
8080: 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f  S)..  **.  ** Ho
8090: 77 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65  wever it has bee
80a0: 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  n discovered tha
80b0: 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  t on some system
80c0: 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63  s this pattern c
80d0: 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e  an .  ** be sign
80e0: 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72  ificantly slower
80f0: 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73   than contiguous
8100: 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20  ly writing data 
8110: 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a  to the file,.  *
8120: 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  * even if that m
8130: 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20  eans explicitly 
8140: 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20  writing data to 
8150: 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20  the block of .  
8160: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
8170: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74  SZ - 28) bytes t
8180: 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  hat will not be 
8190: 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73  used. So that is
81a0: 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f   what.  ** is do
81b0: 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ne. .  **.  ** T
81c0: 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69  he loop is requi
81d0: 72 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65  red here in case
81e0: 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65   the sector-size
81f0: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
8200: 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61  the .  ** databa
8210: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69  se page size. Si
8220: 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20  nce the zHeader 
8230: 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50  buffer is only P
8240: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20  ager.pageSize.  
8250: 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
8260: 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  , more than one 
8270: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
8280: 73 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20  sWrite() may be 
8290: 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f  required.  ** to
82a0: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e   populate the en
82b0: 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tire journal hea
82c0: 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f  der sector..  */
82d0: 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30   .  for(nWrite=0
82e0: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26  ; rc==SQLITE_OK&
82f0: 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f  &nWrite<JOURNAL_
8300: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20  HDR_SZ(pPager); 
8310: 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29  nWrite+=nHeader)
8320: 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
8330: 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
8340: 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
8350: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20  er->journalHdr, 
8360: 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63  nHeader)).    rc
8370: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
8380: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
8390: 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c  Header, nHeader,
83a0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
83b0: 4f 66 66 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Off);.    pPager
83c0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
83d0: 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  nHeader;.  }..  
83e0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
83f0: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
8400: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
8410: 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63  n when this is c
8420: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
8430: 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20   header file.** 
8440: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
8450: 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20 66  bytes) is read f
8460: 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20  rom the current 
8470: 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  location in the 
8480: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e  journal.** file.
8490: 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   The current loc
84a0: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75  ation in the jou
84b0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67 69 76  rnal file is giv
84c0: 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d  en by.** pPager-
84d0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65  >journalOff. See
84e0: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
84f0: 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f  function writeJo
8500: 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a  urnalHdr() for.*
8510: 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20  * a description 
8520: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
8530: 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a  eader format..**
8540: 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 65  .** If the heade
8550: 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65 73  r is read succes
8560: 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69  sfully, *pNRec i
8570: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
8580: 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72  ber of.** page r
8590: 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67  ecords following
85a0: 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64   this header and
85b0: 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73 65 74   *pDbSize is set
85c0: 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
85d0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
85e0: 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
85f0: 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e  action began, in
8600: 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50   pages. Also, pP
8610: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a  ager->cksumInit.
8620: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ** is set to the
8630: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
8640: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
8650: 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  der. SQLITE_OK i
8660: 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e  s returned.** in
8670: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
8680: 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
8690: 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70 70   header file app
86a0: 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75  ears to be corru
86b0: 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e  pted, SQLITE_DON
86c0: 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  E is.** returned
86d0: 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64 20   and *pNRec and 
86e0: 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75 6e 64  *PDbSize are und
86f0: 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52  efined.  If JOUR
8700: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
8710: 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65  .** cannot be re
8720: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
8730: 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f  nal file an erro
8740: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
8750: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
8760: 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  t readJournalHdr
8770: 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
8780: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
8790: 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
87a0: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
87b0: 6c 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  lSize,          
87c0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
87d0: 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66  e open journal f
87e0: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
87f0: 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20    u32 *pNRec,   
8800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8810: 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61  * OUT: Value rea
8820: 64 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20  d from the nRec 
8830: 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a  field */.  u32 *
8840: 70 44 62 53 69 7a 65 20 20 20 20 20 20 20 20 20  pDbSize         
8850: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
8860: 56 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61  Value of origina
8870: 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
8880: 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  field */.){.  in
8890: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
88a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
88b0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
88c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
88d0: 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41  gic[8];     /* A
88e0: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
88f0: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
8900: 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
8910: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
8920: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
8930: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62  journal header b
8940: 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20  eing read */..  
8950: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
8960: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20  Pager->jfd) );  
8970: 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66      /* Journal f
8980: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
8990: 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e  . */..  /* Advan
89a0: 63 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ce Pager.journal
89b0: 4f 66 66 20 74 6f 20 74 68 65 20 73 74 61 72 74  Off to the start
89c0: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65 63   of the next sec
89d0: 74 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a  tor. If the.  **
89e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
89f0: 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74   too small for t
8a00: 68 65 72 65 20 74 6f 20 62 65 20 61 20 68 65 61  here to be a hea
8a10: 64 65 72 20 73 74 6f 72 65 64 20 61 74 20 74 68  der stored at th
8a20: 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72  is.  ** point, r
8a30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
8a40: 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  E..  */.  pPager
8a50: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a  ->journalOff = j
8a60: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
8a70: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
8a80: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
8a90: 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f+JOURNAL_HDR_SZ
8aa0: 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e  (pPager) > journ
8ab0: 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  alSize ){.    re
8ac0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
8ad0: 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20  ;.  }.  iHdrOff 
8ae0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
8af0: 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  lOff;..  /* Read
8b00: 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 38 20   in the first 8 
8b10: 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75  bytes of the jou
8b20: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20  rnal header. If 
8b30: 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63  they do not matc
8b40: 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69  h.  ** the  magi
8b50: 63 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61  c string found a
8b60: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
8b70: 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ach journal head
8b80: 65 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  er, return.  ** 
8b90: 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20  SQLITE_DONE. If 
8ba0: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
8bb0: 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  rs, return an er
8bc0: 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77  ror code. Otherw
8bd0: 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65  ise,.  ** procee
8be0: 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  d..  */.  rc = s
8bf0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
8c00: 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
8c10: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
8c20: 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 69 66  , iHdrOff);.  if
8c30: 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
8c40: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
8c50: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
8c60: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
8c70: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d  izeof(aMagic))!=
8c80: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
8c90: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
8ca0: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
8cb0: 66 69 72 73 74 20 74 68 72 65 65 20 33 32 2d 62  first three 32-b
8cc0: 69 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  it fields of the
8cd0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a   journal header:
8ce0: 20 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66   The nRec.  ** f
8cf0: 69 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73  ield, the checks
8d00: 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61  um-initializer a
8d10: 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
8d20: 73 69 7a 65 20 61 74 20 74 68 65 20 73 74 61 72  size at the star
8d30: 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72  t.  ** of the tr
8d40: 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72  ansaction. Retur
8d50: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
8d60: 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
8d70: 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69   wrong..  */.  i
8d80: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
8d90: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8da0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8db0: 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20  Off+8, pNRec)). 
8dc0: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
8dd0: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
8de0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
8df0: 64 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65  drOff+12, &pPage
8e00: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20  r->cksumInit)). 
8e10: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
8e20: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
8e30: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
8e40: 64 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a  drOff+16, pDbSiz
8e50: 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  e)).  ){.    ret
8e60: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69  urn rc;.  }..  i
8e70: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
8e80: 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
8e90: 75 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20  u32 iPageSize;  
8ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8eb0: 50 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20  Page-size field 
8ec0: 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
8ed0: 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65  r */.    u32 iSe
8ee0: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
8ef0: 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d        /* Sector-
8f00: 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f  size field of jo
8f10: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
8f20: 20 20 20 20 75 31 36 20 69 50 61 67 65 53 69 7a      u16 iPageSiz
8f30: 65 31 36 3b 20 20 20 20 20 20 20 20 20 20 20 20  e16;            
8f40: 20 2f 2a 20 43 6f 70 79 20 6f 66 20 69 50 61 67   /* Copy of iPag
8f50: 65 53 69 7a 65 20 69 6e 20 31 36 2d 62 69 74 20  eSize in 16-bit 
8f60: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20  variable */..   
8f70: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67   /* Read the pag
8f80: 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f  e-size and secto
8f90: 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68  r-size journal h
8fa0: 65 61 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f  eader fields. */
8fb0: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
8fc0: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
8fd0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
8fe0: 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69  , iHdrOff+20, &i
8ff0: 53 65 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20  SectorSize)).   
9000: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
9010: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
9020: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
9030: 64 72 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65  drOff+24, &iPage
9040: 53 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20  Size)).    ){.  
9050: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
9060: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
9070: 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
9080: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
9090: 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
90a0: 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64  ector-size field
90b0: 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74  s.    ** are wit
90c0: 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65  hin range. To be
90d0: 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74   'in range', bot
90e0: 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f  h values need to
90f0: 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20   be a power.    
9100: 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65  ** of two greate
9110: 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
9120: 74 6f 20 35 31 32 2c 20 61 6e 64 20 6e 6f 74 20  to 512, and not 
9130: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
9140: 69 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65  ir .    ** respe
9150: 63 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69  ctive compile ti
9160: 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74  me maximum limit
9170: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
9180: 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20  ( iPageSize<512 
9190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91a0: 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c   || iSectorSize<
91b0: 35 31 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67  512.     || iPag
91c0: 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
91d0: 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53  _PAGE_SIZE || iS
91e0: 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45  ectorSize>MAX_SE
91f0: 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c  CTOR_SIZE.     |
9200: 7c 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29  | ((iPageSize-1)
9210: 26 69 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20  &iPageSize)!=0  
9220: 20 7c 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a   || ((iSectorSiz
9230: 65 2d 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65  e-1)&iSectorSize
9240: 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0 .    ){.   
9250: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74     /* If the eit
9260: 68 65 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a  her the page-siz
9270: 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65  e or sector-size
9280: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   in the journal-
9290: 68 65 61 64 65 72 20 69 73 20 0a 20 20 20 20 20  header is .     
92a0: 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65   ** invalid, the
92b0: 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  n the process th
92c0: 61 74 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75  at wrote the jou
92d0: 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74  rnal-header must
92e0: 20 68 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20   have .      ** 
92f0: 63 72 61 73 68 65 64 20 62 65 66 6f 72 65 20 74  crashed before t
9300: 68 65 20 68 65 61 64 65 72 20 77 61 73 20 73 79  he header was sy
9310: 6e 63 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  nced. In this ca
9320: 73 65 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20  se stop reading 
9330: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  .      ** the jo
9340: 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e  urnal file here.
9350: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
9360: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
9370: 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  NE;.    }..    /
9380: 2a 20 55 70 64 61 74 65 20 74 68 65 20 70 61 67  * Update the pag
9390: 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  e-size to match 
93a0: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
93b0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  rom the journal.
93c0: 20 0a 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74   .    ** Use a t
93d0: 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20  estcase() macro 
93e0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
93f0: 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  t malloc failure
9400: 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20   within .    ** 
9410: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
9420: 28 29 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20  () is tested..  
9430: 20 20 2a 2f 0a 20 20 20 20 69 50 61 67 65 53 69    */.    iPageSi
9440: 7a 65 31 36 20 3d 20 28 75 31 36 29 69 50 61 67  ze16 = (u16)iPag
9450: 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20  eSize;.    rc = 
9460: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
9470: 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20  agesize(pPager, 
9480: 26 69 50 61 67 65 53 69 7a 65 31 36 2c 20 2d 31  &iPageSize16, -1
9490: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
94a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
94b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
94c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
94d0: 50 61 67 65 53 69 7a 65 31 36 3d 3d 28 75 31 36  PageSize16==(u16
94e0: 29 69 50 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20  )iPageSize );.. 
94f0: 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
9500: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d   assumed sector-
9510: 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
9520: 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20  e value used by 
9530: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63  .    ** the proc
9540: 65 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64  ess that created
9550: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49   this journal. I
9560: 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  f this journal w
9570: 61 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  as.    ** create
9580: 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f  d by a process o
9590: 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f  ther than this o
95a0: 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  ne, then this ro
95b0: 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20  utine.    ** is 
95c0: 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f  being called fro
95d0: 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70  m within pager_p
95e0: 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c  layback(). The l
95f0: 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a  ocal value.    *
9600: 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f  * of Pager.secto
9610: 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65  rSize is restore
9620: 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
9630: 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20  that routine..  
9640: 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
9650: 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53  >sectorSize = iS
9660: 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a  ectorSize;.  }..
9670: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
9680: 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f  lOff += JOURNAL_
9690: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
96a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
96b0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
96c0: 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72   supplied master
96d0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
96e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
96f0: 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a  ile for pager.**
9700: 20 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63   pPager at the c
9710: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
9720: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
9730: 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65  nal name must be
9740: 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69   the last.** thi
9750: 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20  ng written to a 
9760: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
9770: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
9780: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
9790: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
97a0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
97b0: 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74  is advanced to t
97c0: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62  he next sector b
97d0: 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a  oundary before.*
97e0: 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72  * anything is wr
97f0: 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61  itten. The forma
9800: 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20  t is:.**.**   + 
9810: 34 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d  4 bytes: PAGER_M
9820: 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e  J_PGNO..**   + N
9830: 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
9840: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
9850: 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b  in utf-8..**   +
9860: 20 34 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e   4 bytes: N (len
9870: 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  gth of master jo
9880: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79  urnal name in by
9890: 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d  tes, no nul-term
98a0: 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20  inator)..**   + 
98b0: 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20  4 bytes: Master 
98c0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65  journal name che
98d0: 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20  cksum..**   + 8 
98e0: 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d  bytes: aJournalM
98f0: 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68  agic[]..**.** Th
9900: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9910: 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69   page checksum i
9920: 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
9930: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61   bytes in the ma
9940: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
9950: 6e 61 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68  name, where each
9960: 20 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72   byte is interpr
9970: 65 74 65 64 20 61 73 20 61 20 73 69 67 6e 65 64  eted as a signed
9980: 20 38 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a   8-bit integer..
9990: 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72  **.** If zMaster
99a0: 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
99b0: 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61  er (occurs for a
99c0: 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
99d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a   transaction), .
99e0: 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  ** this call is 
99f0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
9a00: 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74  ic int writeMast
9a10: 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  erJournal(Pager 
9a20: 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
9a30: 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
9a40: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
9a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a60: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
9a70: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65   */.  int nMaste
9a80: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
9a90: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
9aa0: 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74   of string zMast
9ab0: 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  er */.  i64 iHdr
9ac0: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
9ad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
9ae0: 65 74 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20  et of header in 
9af0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
9b00: 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20    i64 jrnlSize; 
9b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b20: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f     /* Size of jo
9b30: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69  urnal file on di
9b40: 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  sk */.  u32 cksu
9b50: 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  m = 0;          
9b60: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
9b70: 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a  ksum of string z
9b80: 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20 69 66 28  Master */..  if(
9b90: 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61   !zMaster || pPa
9ba0: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 0a 20  ger->setMaster. 
9bb0: 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
9bc0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
9bd0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
9be0: 52 59 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72  RY .   || pPager
9bf0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
9c00: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
9c10: 5f 4f 46 46 20 0a 20 20 29 7b 0a 20 20 20 20 72  _OFF .  ){.    r
9c20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
9c30: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
9c40: 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20  etMaster = 1;.  
9c50: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
9c60: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a  Pager->jfd) );..
9c70: 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74    /* Calculate t
9c80: 68 65 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74  he length in byt
9c90: 65 73 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b  es and the check
9ca0: 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a  sum of zMaster *
9cb0: 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d  /.  for(nMaster=
9cc0: 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74  0; zMaster[nMast
9cd0: 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b  er]; nMaster++){
9ce0: 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d  .    cksum += zM
9cf0: 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a  aster[nMaster];.
9d00: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20    }..  /* If in 
9d10: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
9d20: 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  advance to the n
9d30: 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20  ext disk sector 
9d40: 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20  before writing. 
9d50: 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a   ** the master j
9d60: 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69  ournal name. Thi
9d70: 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65  s is in case the
9d80: 20 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77   previous page w
9d90: 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74  ritten to.  ** t
9da0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61  he journal has a
9db0: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63  lready been sync
9dc0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
9dd0: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
9de0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
9df0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72  ournalOff = jour
9e00: 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
9e10: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72  ger);.  }.  iHdr
9e20: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
9e30: 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20  urnalOff;..  /* 
9e40: 57 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  Write the master
9e50: 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f   journal data to
9e60: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
9e70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
9e80: 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f  .  ** an error o
9e90: 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68  ccurs, return th
9ea0: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  e error code to 
9eb0: 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f  the caller..  */
9ec0: 0a 20 20 69 66 28 20 28 30 20 21 3d 20 28 72 63  .  if( (0 != (rc
9ed0: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
9ee0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
9ef0: 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47  Off, PAGER_MJ_PG
9f00: 4e 4f 28 70 50 61 67 65 72 29 29 29 29 0a 20 20  NO(pPager)))).  
9f10: 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
9f20: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
9f30: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
9f40: 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48  ter, nMaster, iH
9f50: 64 72 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c  drOff+4))).   ||
9f60: 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69   (0 != (rc = wri
9f70: 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
9f80: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b  >jfd, iHdrOff+4+
9f90: 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72  nMaster, nMaster
9fa0: 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
9fb0: 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74  (rc = write32bit
9fc0: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
9fd0: 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
9fe0: 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20  +4, cksum))).   
9ff0: 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73  || (0 != (rc = s
a000: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
a010: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72  ager->jfd, aJour
a020: 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 20 69 48 64  nalMagic, 8, iHd
a030: 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38  rOff+4+nMaster+8
a040: 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ))).  ){.    ret
a050: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
a060: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
a070: 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29   += (nMaster+20)
a080: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
a090: 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e  Sync = !pPager->
a0a0: 6e 6f 53 79 6e 63 3b 0a 0a 20 20 2f 2a 20 49 66  noSync;..  /* If
a0b0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
a0c0: 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e   peristent-journ
a0d0: 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  al mode, then th
a0e0: 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a  e physical .  **
a0f0: 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61   journal-file ma
a100: 79 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68  y extend past th
a110: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73  e end of the mas
a120: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
a130: 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65  .  ** and 8 byte
a140: 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20  s of magic data 
a150: 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20  just written to 
a160: 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69  the file. This i
a170: 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75  s .  ** dangerou
a180: 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f  s because the co
a190: 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  de to rollback a
a1a0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
a1b0: 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  e.  ** will not 
a1c0: 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20  be able to find 
a1d0: 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
a1e0: 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72  al name to deter
a1f0: 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68  mine .  ** wheth
a200: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
a210: 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20  urnal is hot. . 
a220: 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74   **.  ** Easiest
a230: 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20   thing to do in 
a240: 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73  this scenario is
a250: 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
a260: 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66   journal .  ** f
a270: 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75 69  ile to the requi
a280: 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a  red size..  */ .
a290: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
a2a0: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
a2b0: 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
a2c0: 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29  >jfd, &jrnlSize)
a2d0: 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65  ).   && jrnlSize
a2e0: 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  >pPager->journal
a2f0: 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  Off.  ){.    rc 
a300: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
a310: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
a320: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
a330: 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Off);.  }.  retu
a340: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
a350: 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  Find a page in t
a360: 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69  he hash table gi
a370: 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d  ven its page num
a380: 62 65 72 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61  ber. Return.** a
a390: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
a3a0: 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20  page or NULL if 
a3b0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
a3c0: 67 65 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c  ge is not .** al
a3d0: 72 65 61 64 79 20 69 6e 20 6d 65 6d 6f 72 79 2e  ready in memory.
a3e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72  .*/.static PgHdr
a3f0: 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50   *pager_lookup(P
a400: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
a410: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
a420: 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
a430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a440: 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
a450: 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74  ..  /* It is not
a460: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20   possible for a 
a470: 63 61 6c 6c 20 74 6f 20 50 63 61 63 68 65 46 65  call to PcacheFe
a480: 74 63 68 28 29 20 77 69 74 68 20 63 72 65 61 74  tch() with creat
a490: 65 46 6c 61 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a  eFlag==0 to.  **
a4a0: 20 66 61 69 6c 2c 20 73 69 6e 63 65 20 6e 6f 20   fail, since no 
a4b0: 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63  attempt to alloc
a4c0: 61 74 65 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f  ate dynamic memo
a4d0: 72 79 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 2e  ry will be made.
a4e0: 0a 20 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71  .  */.  (void)sq
a4f0: 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
a500: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
a510: 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a  , pgno, 0, &p);.
a520: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
a530: 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65 20  *.** Unless the 
a540: 70 61 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f  pager is in erro
a550: 72 2d 73 74 61 74 65 2c 20 64 69 73 63 61 72 64  r-state, discard
a560: 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   all in-memory p
a570: 61 67 65 73 2e 20 49 66 0a 2a 2a 20 74 68 65 20  ages. If.** the 
a580: 70 61 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f  pager is in erro
a590: 72 2d 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68  r-state, then th
a5a0: 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
a5b0: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20  op..**.** TODO: 
a5c0: 57 68 79 20 63 61 6e 20 77 65 20 6e 6f 74 20 72  Why can we not r
a5d0: 65 73 65 74 20 74 68 65 20 70 61 67 65 72 20 77  eset the pager w
a5e0: 68 69 6c 65 20 69 6e 20 65 72 72 6f 72 20 73 74  hile in error st
a5f0: 61 74 65 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ate?.*/.static v
a600: 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28  oid pager_reset(
a610: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
a620: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
a630: 3d 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  =pPager->errCode
a640: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
a650: 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61  ackupRestart(pPa
a660: 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20  ger->pBackup);. 
a670: 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
a680: 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50  Clear(pPager->pP
a690: 43 61 63 68 65 29 3b 0a 20 20 20 20 70 50 61 67  Cache);.    pPag
a6a0: 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
a6b0: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
a6c0: 2a 20 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63  * Free all struc
a6d0: 74 75 72 65 73 20 69 6e 20 74 68 65 20 50 61 67  tures in the Pag
a6e0: 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20  er.aSavepoint[] 
a6f0: 61 72 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f  array and set bo
a700: 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76  th.** Pager.aSav
a710: 65 70 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72  epoint and Pager
a720: 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a  .nSavepoint to z
a730: 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73  ero. Close the s
a740: 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66  ub-journal.** if
a750: 20 69 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20   it is open and 
a760: 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
a770: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
a780: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  de..*/.static vo
a790: 69 64 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  id releaseAllSav
a7a0: 65 70 6f 69 6e 74 73 28 50 61 67 65 72 20 2a 70  epoints(Pager *p
a7b0: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69  Pager){.  int ii
a7c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a7d0: 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20  /* Iterator for 
a7e0: 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
a7f0: 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
a800: 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   */.  for(ii=0; 
a810: 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
a820: 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
a830: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
a840: 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61  estroy(pPager->a
a850: 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49  Savepoint[ii].pI
a860: 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d  nSavepoint);.  }
a870: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
a880: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
a890: 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75   sqlite3IsMemJou
a8a0: 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66  rnal(pPager->sjf
a8b0: 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  d) ){.    sqlite
a8c0: 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
a8d0: 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71  >sjfd);.  }.  sq
a8e0: 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
a8f0: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a  r->aSavepoint);.
a900: 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70    pPager->aSavep
a910: 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  oint = 0;.  pPag
a920: 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d  er->nSavepoint =
a930: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53   0;.  pPager->nS
a940: 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ubRec = 0;.}../*
a950: 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74 20  .** Set the bit 
a960: 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74  number pgno in t
a970: 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
a980: 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a  t.pInSavepoint .
a990: 2a 2a 20 62 69 74 76 65 63 73 20 6f 66 20 61 6c  ** bitvecs of al
a9a0: 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  l open savepoint
a9b0: 73 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  s. Return SQLITE
a9c0: 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
a9d0: 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e  l.** or SQLITE_N
a9e0: 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63  OMEM if a malloc
a9f0: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e   failure occurs.
aa00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
aa10: 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
aa20: 76 65 63 73 28 50 61 67 65 72 20 2a 70 50 61 67  vecs(Pager *pPag
aa30: 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
aa40: 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
aa50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
aa60: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
aa70: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
aa80: 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  _OK;       /* Re
aa90: 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  sult code */..  
aaa0: 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
aab0: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
aac0: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65   ii++){.    Page
aad0: 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20  rSavepoint *p = 
aae0: 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  &pPager->aSavepo
aaf0: 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28  int[ii];.    if(
ab00: 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20   pgno<=p->nOrig 
ab10: 29 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20 73  ){.      rc |= s
ab20: 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
ab30: 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c  p->pInSavepoint,
ab40: 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65   pgno);.      te
ab50: 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
ab60: 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
ab70: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
ab80: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53  LITE_OK || rc==S
ab90: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
aba0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
abb0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  n rc;.}../*.** U
abc0: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
abd0: 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 66 75  se file. This fu
abe0: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
abf0: 70 20 69 66 20 74 68 65 20 70 61 67 65 72 0a 2a  p if the pager.*
ac00: 2a 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  * is in exclusiv
ac10: 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e mode..**.** If
ac20: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63 75   the pager is cu
ac30: 72 72 65 6e 74 6c 79 20 69 6e 20 65 72 72 6f 72  rrently in error
ac40: 20 73 74 61 74 65 2c 20 64 69 73 63 61 72 64 20   state, discard 
ac50: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
ac60: 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 61 6e  .** the cache an
ac70: 64 20 72 65 73 65 74 20 74 68 65 20 50 61 67 65  d reset the Page
ac80: 72 20 73 74 72 75 63 74 75 72 65 20 69 6e 74 65  r structure inte
ac90: 72 6e 61 6c 20 73 74 61 74 65 2e 20 49 66 20 74  rnal state. If t
aca0: 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 6f 70  here is.** an op
acb0: 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 2c  en journal-file,
acc0: 20 74 68 65 6e 20 74 68 65 20 6e 65 78 74 20 74   then the next t
acd0: 69 6d 65 20 61 20 73 68 61 72 65 64 2d 6c 6f 63  ime a shared-loc
ace0: 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  k is obtained.**
acf0: 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 66 69   on the pager fi
ad00: 6c 65 20 28 62 79 20 74 68 69 73 20 6f 72 20 61  le (by this or a
ad10: 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
ad20: 29 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a 2a 2a  ), it will be.**
ad30: 20 74 72 65 61 74 65 64 20 61 73 20 61 20 68 6f   treated as a ho
ad40: 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f  t-journal and ro
ad50: 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74  lled back..*/.st
ad60: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
ad70: 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  unlock(Pager *pP
ad80: 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50  ager){.  if( !pP
ad90: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
ada0: 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ode ){.    int r
adb0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
adc0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
add0: 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 20 20 2f  n code */..    /
ade0: 2a 20 41 6c 77 61 79 73 20 63 6c 6f 73 65 20 74  * Always close t
adf0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
ae00: 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68  when dropping th
ae10: 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e  e database lock.
ae20: 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  .    ** Otherwis
ae30: 65 2c 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65  e, another conne
ae40: 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e  ction with journ
ae50: 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d  al_mode=delete m
ae60: 69 67 68 74 0a 20 20 20 20 2a 2a 20 64 65 6c 65  ight.    ** dele
ae70: 74 65 20 74 68 65 20 66 69 6c 65 20 6f 75 74 20  te the file out 
ae80: 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20  from under us.. 
ae90: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
aea0: 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
aeb0: 3e 6a 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  >jfd);.    sqlit
aec0: 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
aed0: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
aee0: 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  al);.    pPager-
aef0: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
af00: 0a 20 20 20 20 72 65 6c 65 61 73 65 41 6c 6c 53  .    releaseAllS
af10: 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72  avepoints(pPager
af20: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
af30: 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  e file is unlock
af40: 65 64 2c 20 73 6f 6d 65 62 6f 64 79 20 65 6c 73  ed, somebody els
af50: 65 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 69  e might change i
af60: 74 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 76 61  t. The.    ** va
af70: 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 50  lues stored in P
af80: 61 67 65 72 2e 64 62 53 69 7a 65 20 65 74 63 2e  ager.dbSize etc.
af90: 20 6d 69 67 68 74 20 62 65 63 6f 6d 65 20 69 6e   might become in
afa0: 76 61 6c 69 64 20 69 66 0a 20 20 20 20 2a 2a 20  valid if.    ** 
afb0: 74 68 69 73 20 68 61 70 70 65 6e 73 2e 20 54 4f  this happens. TO
afc0: 44 4f 3a 20 52 65 61 6c 6c 79 2c 20 74 68 69 73  DO: Really, this
afd0: 20 64 6f 65 73 6e 27 74 20 6e 65 65 64 20 74 6f   doesn't need to
afe0: 20 62 65 20 63 6c 65 61 72 65 64 0a 20 20 20 20   be cleared.    
aff0: 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 63 68 61  ** until the cha
b000: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 63 68 65 63  nge-counter chec
b010: 6b 20 66 61 69 6c 73 20 69 6e 20 70 61 67 65 72  k fails in pager
b020: 53 68 61 72 65 64 4c 6f 63 6b 28 29 2e 0a 20 20  SharedLock()..  
b030: 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
b040: 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30  >dbSizeValid = 0
b050: 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6f 73 55 6e  ;..    rc = osUn
b060: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
b070: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69   NO_LOCK);.    i
b080: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 70  f( rc ){.      p
b090: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
b0a0: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49   rc;.    }.    I
b0b0: 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  OTRACE(("UNLOCK 
b0c0: 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
b0d0: 0a 20 20 20 20 2f 2a 20 49 66 20 50 61 67 65 72  .    /* If Pager
b0e0: 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c  .errCode is set,
b0f0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
b100: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
b110: 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 20 20 2a   cannot be.    *
b120: 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74  * trusted. Now t
b130: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 66 69  hat the pager fi
b140: 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20  le is unlocked, 
b150: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
b160: 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 63 68 65  the.    ** cache
b170: 20 63 61 6e 20 62 65 20 64 69 73 63 61 72 64 65   can be discarde
b180: 64 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20  d and the error 
b190: 63 6f 64 65 20 73 61 66 65 6c 79 20 63 6c 65 61  code safely clea
b1a0: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
b1b0: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
b1c0: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ode ){.      if(
b1d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
b1e0: 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
b1f0: 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49  ->errCode = SQLI
b200: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
b210: 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
b220: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
b230: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
b240: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30  ngeCountDone = 0
b250: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
b260: 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
b270: 43 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  CK;.  }.}../*.**
b280: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
b290: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
b2a0: 77 68 65 6e 20 61 6e 20 49 4f 45 52 52 2c 20 43  when an IOERR, C
b2b0: 4f 52 52 55 50 54 20 6f 72 20 46 55 4c 4c 20 65  ORRUPT or FULL e
b2c0: 72 72 6f 72 0a 2a 2a 20 6d 61 79 20 68 61 76 65  rror.** may have
b2d0: 20 6f 63 63 75 72 72 65 64 2e 20 54 68 65 20 66   occurred. The f
b2e0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
b2f0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
b300: 65 20 70 61 67 65 72 20 0a 2a 2a 20 73 74 72 75  e pager .** stru
b310: 63 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f 6e  cture, the secon
b320: 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65  d the error-code
b330: 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74   about to be ret
b340: 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72  urned by a pager
b350: 20 0a 2a 2a 20 41 50 49 20 66 75 6e 63 74 69 6f   .** API functio
b360: 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  n. The value ret
b370: 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20  urned is a copy 
b380: 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  of the second ar
b390: 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 74 68  gument .** to th
b3a0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a  is function. .**
b3b0: 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e  .** If the secon
b3c0: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51  d argument is SQ
b3d0: 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49  LITE_IOERR, SQLI
b3e0: 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20 53  TE_CORRUPT, or S
b3f0: 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68  QLITE_FULL.** th
b400: 65 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73 20  e error becomes 
b410: 70 65 72 73 69 73 74 65 6e 74 2e 20 55 6e 74 69  persistent. Unti
b420: 6c 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 20  l the persisten 
b430: 65 72 72 6f 72 20 69 73 20 63 6c 65 61 72 65 64  error is cleared
b440: 2c 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20  ,.** subsequent 
b450: 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69  API calls on thi
b460: 73 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d  s Pager will imm
b470: 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20  ediately return 
b480: 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65 72 72  the same .** err
b490: 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41  or code..**.** A
b4a0: 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f   persistent erro
b4b0: 72 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  r indicates that
b4c0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
b4d0: 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
b4e0: 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74   .** cannot be t
b4f0: 72 75 73 74 65 64 2e 20 54 68 69 73 20 73 74 61  rusted. This sta
b500: 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65  te can be cleare
b510: 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20  d by completely 
b520: 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74  discarding .** t
b530: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
b540: 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20  he pager-cache. 
b550: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
b560: 20 77 61 73 20 61 63 74 69 76 65 20 77 68 65 6e   was active when
b570: 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65  .** the persiste
b580: 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  nt error occurre
b590: 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  d, then the roll
b5a0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79  back journal may
b5b0: 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72   need.** to be r
b5c0: 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f  eplayed to resto
b5d0: 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  re the contents 
b5e0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
b5f0: 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69  file (as if.** i
b600: 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75  t were a hot-jou
b610: 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  rnal)..*/.static
b620: 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72   int pager_error
b630: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
b640: 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72  int rc){.  int r
b650: 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a  c2 = rc & 0xff;.
b660: 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20    assert(.      
b670: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
b680: 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
b690: 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
b6a0: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
b6b0: 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50  OK ||.       (pP
b6c0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20  ager->errCode & 
b6d0: 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f  0xff)==SQLITE_IO
b6e0: 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 0a 20  ERR.  );.  if(. 
b6f0: 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46     rc2==SQLITE_F
b700: 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d  ULL ||.    rc2==
b710: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a  SQLITE_IOERR ||.
b720: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
b730: 43 4f 52 52 55 50 54 0a 20 20 29 7b 0a 20 20 20  CORRUPT.  ){.   
b740: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
b750: 20 3d 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70   = rc;.    if( p
b760: 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
b770: 47 45 52 5f 55 4e 4c 4f 43 4b 20 0a 20 20 20 20  GER_UNLOCK .    
b780: 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68   && sqlite3Pcach
b790: 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
b7a0: 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20  ->pPCache)==0 . 
b7b0: 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49     ){.      /* I
b7c0: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61  f the pager is a
b7d0: 6c 72 65 61 64 79 20 75 6e 6c 6f 63 6b 65 64 2c  lready unlocked,
b7e0: 20 63 61 6c 6c 20 70 61 67 65 72 5f 75 6e 6c 6f   call pager_unlo
b7f0: 63 6b 28 29 20 6e 6f 77 20 74 6f 0a 20 20 20 20  ck() now to.    
b800: 20 20 2a 2a 20 63 6c 65 61 72 20 74 68 65 20 65    ** clear the e
b810: 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20 65  rror state and e
b820: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70  nsure that the p
b830: 61 67 65 72 2d 63 61 63 68 65 20 69 73 20 0a 20  ager-cache is . 
b840: 20 20 20 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65       ** complete
b850: 6c 79 20 65 6d 70 74 79 2e 0a 20 20 20 20 20 20  ly empty..      
b860: 2a 2f 0a 20 20 20 20 20 20 70 61 67 65 72 5f 75  */.      pager_u
b870: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
b880: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
b890: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
b8a0: 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63  xecute a rollbac
b8b0: 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  k if a transacti
b8c0: 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 64  on is active and
b8d0: 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20   unlock the .** 
b8e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a  database file. .
b8f0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
b900: 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65  er has already e
b910: 6e 74 65 72 65 64 20 74 68 65 20 65 72 72 6f 72  ntered the error
b920: 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61   state, do not a
b930: 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72  ttempt .** the r
b940: 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68 69 73 20  ollback at this 
b950: 74 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20 70  time. Instead, p
b960: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73  ager_unlock() is
b970: 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20   called. The.** 
b980: 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e  call to pager_un
b990: 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69 73 63  lock() will disc
b9a0: 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72  ard all in-memor
b9b0: 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a  y pages, unlock.
b9c0: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
b9d0: 66 69 6c 65 20 61 6e 64 20 63 6c 65 61 72 20 74  file and clear t
b9e0: 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20  he error state. 
b9f0: 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68  If this means th
ba00: 61 74 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61  at.** there is a
ba10: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66   hot-journal lef
ba20: 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  t in the file-sy
ba30: 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20 63  stem, the next c
ba40: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20  onnection.** to 
ba50: 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20  obtain a shared 
ba60: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65  lock on the page
ba70: 72 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20  r (which may be 
ba80: 74 68 69 73 20 6f 6e 65 29 20 77 69 6c 6c 0a 2a  this one) will.*
ba90: 2a 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a  * roll it back..
baa0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
bab0: 65 72 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  er has not alrea
bac0: 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 65  dy entered the e
bad0: 72 72 6f 72 20 73 74 61 74 65 2c 20 62 75 74 20  rror state, but 
bae0: 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c  an IO or.** mall
baf0: 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  oc error occurs 
bb00: 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
bb10: 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 77 69 6c  k, then this wil
bb20: 6c 20 69 74 73 65 6c 66 20 63 61 75 73 65 20 0a  l itself cause .
bb30: 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  ** the pager to 
bb40: 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20  enter the error 
bb50: 73 74 61 74 65 2e 20 57 68 69 63 68 20 77 69 6c  state. Which wil
bb60: 6c 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20  l be cleared by 
bb70: 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70  the.** call to p
bb80: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61  ager_unlock(), a
bb90: 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
bba0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
bbb0: 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64  d pagerUnlockAnd
bbc0: 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  Rollback(Pager *
bbd0: 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
bbe0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
bbf0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
bc00: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
bc10: 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
bc20: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
bc30: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
bc40: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
bc50: 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
bc60: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
bc70: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
bc80: 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  }.  pager_unlock
bc90: 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  (pPager);.}../*.
bca0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
bcb0: 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69  ends a transacti
bcc0: 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f  on. A transactio
bcd0: 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64  n is usually end
bce0: 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72  ed by .** either
bcf0: 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52   a COMMIT or a R
bd00: 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f  OLLBACK operatio
bd10: 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  n. This routine 
bd20: 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a  may be called .*
bd30: 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b  * after rollback
bd40: 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   of a hot-journa
bd50: 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f  l, or if an erro
bd60: 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f  r occurs while o
bd70: 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f  pening.** the jo
bd80: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72  urnal file or wr
bd90: 69 74 69 6e 67 20 74 68 65 20 76 65 72 79 20 66  iting the very f
bda0: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
bdb0: 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61  der of a.** data
bdc0: 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
bdd0: 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
bde0: 70 61 67 65 72 20 69 73 20 69 6e 20 50 41 47 45  pager is in PAGE
bdf0: 52 5f 53 48 41 52 45 44 20 6f 72 20 50 41 47 45  R_SHARED or PAGE
be00: 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 77  R_UNLOCK state w
be10: 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  hen this.** rout
be20: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ine is called, i
be30: 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20 28 72 65  t is a no-op (re
be40: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 29  turns SQLITE_OK)
be50: 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
be60: 65 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73 61  e, any active sa
be70: 76 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c  vepoints are rel
be80: 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eased..**.** If 
be90: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
bea0: 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69   is open, then i
beb0: 74 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22  t is "finalized"
bec0: 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c  . Once a journal
bed0: 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65   .** file has be
bee0: 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20  en finalized it 
bef0: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
bf00: 74 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c  to use it to rol
bf10: 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61  l back a .** tra
bf20: 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69  nsaction. Nor wi
bf30: 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65  ll it be conside
bf40: 72 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d  red to be a hot-
bf50: 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a  journal by this.
bf60: 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  ** or any other 
bf70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
bf80: 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77  ion. Exactly how
bf90: 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69   a journal is fi
bfa0: 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e  nalized.** depen
bfb0: 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ds on whether or
bfc0: 20 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20 69   not the pager i
bfd0: 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
bfe0: 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a  lusive mode and.
bff0: 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a  ** the current j
c000: 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67  ournal-mode (Pag
c010: 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76  er.journalMode v
c020: 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77  alue), as follow
c030: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  s:.**.**   journ
c040: 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a  alMode==MEMORY.*
c050: 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
c060: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
c070: 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20   simply closed. 
c080: 54 68 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e  This destroys an
c090: 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f   .**     in-memo
c0a0: 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  ry journal..**.*
c0b0: 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
c0c0: 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20  =TRUNCATE.**    
c0d0: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   Journal file is
c0e0: 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65   truncated to ze
c0f0: 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ro bytes in size
c100: 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
c110: 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a  lMode==PERSIST.*
c120: 2a 20 20 20 20 20 54 68 65 20 66 69 72 73 74 20  *     The first 
c130: 32 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  28 bytes of the 
c140: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65  journal file are
c150: 20 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e   zeroed. This in
c160: 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20  validates.**    
c170: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
c180: 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  al header in the
c190: 20 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65   file, and hence
c1a0: 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72   the entire jour
c1b0: 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e  nal.**     file.
c1c0: 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72   An invalid jour
c1d0: 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20  nal file cannot 
c1e0: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
c1f0: 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
c200: 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20  ode==DELETE.**  
c210: 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66     The journal f
c220: 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e  ile is closed an
c230: 64 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  d deleted using 
c240: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
c250: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20  )..**.**     If 
c260: 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
c270: 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
c280: 65 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74  e mode, this met
c290: 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e  hod of finalizin
c2a0: 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75  g.**     the jou
c2b0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76  rnal file is nev
c2c0: 65 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64  er used. Instead
c2d0: 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  , if the journal
c2e0: 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44  Mode is.**     D
c2f0: 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70 61  ELETE and the pa
c300: 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
c310: 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65  ive mode, the me
c320: 74 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 75  thod described u
c330: 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72  nder.**     jour
c340: 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54  nalMode==PERSIST
c350: 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
c360: 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ..**.** After th
c370: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e  e journal is fin
c380: 61 6c 69 7a 65 64 2c 20 69 66 20 72 75 6e 6e 69  alized, if runni
c390: 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73  ng in non-exclus
c3a0: 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a  ive mode, the.**
c3b0: 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20   pager moves to 
c3c0: 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61  PAGER_SHARED sta
c3d0: 74 65 20 28 61 6e 64 20 64 6f 77 6e 67 72 61 64  te (and downgrad
c3e0: 65 73 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  es the lock on t
c3f0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
c400: 69 6c 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 29  ile accordingly)
c410: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
c420: 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
c430: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
c440: 65 20 61 6e 64 20 69 73 20 69 6e 20 50 41 47 45  e and is in PAGE
c450: 52 5f 53 59 4e 43 45 44 20 73 74 61 74 65 2c 0a  R_SYNCED state,.
c460: 2a 2a 20 69 74 20 6d 6f 76 65 73 20 74 6f 20 50  ** it moves to P
c470: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 2e 20  AGER_EXCLUSIVE. 
c480: 4e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 64 6f 77  No locks are dow
c490: 6e 67 72 61 64 65 64 20 77 68 65 6e 20 72 75 6e  ngraded when run
c4a0: 6e 69 6e 67 20 69 6e 0a 2a 2a 20 65 78 63 6c 75  ning in.** exclu
c4b0: 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a  sive mode..**.**
c4c0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
c4d0: 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
c4e0: 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e  or occurs. If an
c4f0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
c500: 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74  ring.** any of t
c510: 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73  he IO operations
c520: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
c530: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
c540: 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64   unlock the.** d
c550: 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68 65  atabase then the
c560: 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
c570: 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
c580: 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a  e user. If the .
c590: 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ** operation to 
c5a0: 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
c5b0: 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c  rnal file fails,
c5c0: 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73   then the code s
c5d0: 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f  till.** tries to
c5e0: 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
c5f0: 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74  base file if not
c600: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
c610: 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e  de. If the.** un
c620: 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66  lock operation f
c630: 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68  ails as well, th
c640: 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72 72  en the first err
c650: 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a  or code related.
c660: 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ** to the first 
c670: 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65  error encountere
c680: 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  d (the journal f
c690: 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29  inalization one)
c6a0: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e   is.** returned.
c6b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
c6c0: 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
c6d0: 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  tion(Pager *pPag
c6e0: 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65  er, int hasMaste
c6f0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
c700: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
c710: 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  * Error code fro
c720: 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69  m journal finali
c730: 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  zation operation
c740: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d 20   */.  int rc2 = 
c750: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f  SQLITE_OK;     /
c760: 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  * Error code fro
c770: 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b  m db file unlock
c780: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20   operation */.. 
c790: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
c7a0: 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45  te<PAGER_RESERVE
c7b0: 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
c7c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
c7d0: 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
c7e0: 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a  oints(pPager);..
c7f0: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
c800: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c  (pPager->jfd) ||
c810: 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
c820: 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  nal==0 );.  if( 
c830: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
c840: 66 64 29 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 54  fd) ){..    /* T
c850: 4f 44 4f 3a 20 54 68 65 72 65 27 73 20 61 20 70  ODO: There's a p
c860: 72 6f 62 6c 65 6d 20 68 65 72 65 20 69 66 20 61  roblem here if a
c870: 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 77 61   journal-file wa
c880: 73 20 6f 70 65 6e 65 64 20 69 6e 20 4d 45 4d 4f  s opened in MEMO
c890: 52 59 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 61  RY.    ** mode a
c8a0: 6e 64 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  nd then the jour
c8b0: 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 63 68 61 6e  nal-mode is chan
c8c0: 67 65 64 20 74 6f 20 54 52 55 4e 43 41 54 45 20  ged to TRUNCATE 
c8d0: 6f 72 20 50 45 52 53 49 53 54 0a 20 20 20 20 2a  or PERSIST.    *
c8e0: 2a 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61  * during the tra
c8f0: 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 63  nsaction. This c
c900: 6f 64 65 20 73 68 6f 75 6c 64 20 62 65 20 63 68  ode should be ch
c910: 61 6e 67 65 64 20 74 6f 20 61 73 73 75 6d 65 0a  anged to assume.
c920: 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20      ** that the 
c930: 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 68 61 73  journal mode has
c940: 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 73 69 6e   not changed sin
c950: 63 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ce the transacti
c960: 6f 6e 20 77 61 73 0a 20 20 20 20 2a 2a 20 73 74  on was.    ** st
c970: 61 72 74 65 64 2e 20 41 6e 64 20 74 68 65 20 73  arted. And the s
c980: 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
c990: 61 6c 4d 6f 64 65 28 29 20 66 75 6e 63 74 69 6f  alMode() functio
c9a0: 6e 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20 20  n should be.    
c9b0: 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f 20 6d 61  ** changed to ma
c9c0: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 69  ke sure that thi
c9d0: 73 20 69 73 20 74 68 65 20 63 61 73 65 20 74 6f  s is the case to
c9e0: 6f 2e 0a 20 20 20 20 2a 2f 0a 0a 20 20 20 20 2f  o..    */..    /
c9f0: 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  * Finalize the j
ca00: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a  ournal file. */.
ca10: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
ca20: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
ca30: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
ca40: 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 69  EMORY ){.      i
ca50: 6e 74 20 69 73 4d 65 6d 6f 72 79 4a 6f 75 72 6e  nt isMemoryJourn
ca60: 61 6c 20 3d 20 73 71 6c 69 74 65 33 49 73 4d 65  al = sqlite3IsMe
ca70: 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  mJournal(pPager-
ca80: 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  >jfd);.      sql
ca90: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
caa0: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
cab0: 69 66 28 20 21 69 73 4d 65 6d 6f 72 79 4a 6f 75  if( !isMemoryJou
cac0: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  rnal ){.        
cad0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
cae0: 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66  lete(pPager->pVf
caf0: 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
cb00: 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  nal, 0);.      }
cb10: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
cb20: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
cb30: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
cb40: 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29  LMODE_TRUNCATE )
cb50: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
cb60: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
cb70: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
cb80: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
cb90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cba0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
cbb0: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
cbc0: 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  >jfd, 0);.      
cbd0: 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
cbe0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
cbf0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
cc00: 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
cc10: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
cc20: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
cc30: 65 4d 6f 64 65 20 0a 20 20 20 20 20 7c 7c 20 70  eMode .     || p
cc40: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
cc50: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
cc60: 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20  LMODE_PERSIST.  
cc70: 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20    ){.      rc = 
cc80: 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70  zeroJournalHdr(p
cc90: 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72  Pager, hasMaster
cca0: 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65  );.      pager_e
ccb0: 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
ccc0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
ccd0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
cce0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
ccf0: 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
cd00: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
cd10: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
cd20: 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
cd30: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
cd40: 45 5f 44 45 4c 45 54 45 20 7c 7c 20 72 63 20 29  E_DELETE || rc )
cd50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
cd60: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
cd70: 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  fd);.      if( r
cd80: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
cd90: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
cda0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
cdb0: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
cdc0: 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
cdd0: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
cde0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
cdf0: 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
ce00: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
ce10: 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
ce20: 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
ce30: 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
ce40: 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
ce50: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73  );.#endif..    s
ce60: 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
ce70: 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43  nAll(pPager->pPC
ce80: 61 63 68 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  ache);.    sqlit
ce90: 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
cea0: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
ceb0: 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  al);.    pPager-
cec0: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
ced0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
cee0: 63 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66  c = 0;.  }..  if
cef0: 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
cf00: 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
cf10: 72 63 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70  rc2 = osUnlock(p
cf20: 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45  Pager->fd, SHARE
cf30: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61  D_LOCK);.    pPa
cf40: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
cf50: 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 70  ER_SHARED;.    p
cf60: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
cf70: 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 65  ntDone = 0;.  }e
cf80: 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
cf90: 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e  state==PAGER_SYN
cfa0: 43 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67 65  CED ){.    pPage
cfb0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
cfc0: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a  _EXCLUSIVE;.  }.
cfd0: 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
cfe0: 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ter = 0;.  pPage
cff0: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
d000: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  .  pPager->dbMod
d010: 69 66 69 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a  ified = 0;..  /*
d020: 20 54 4f 44 4f 3a 20 49 73 20 74 68 69 73 20 6f   TODO: Is this o
d030: 70 74 69 6d 61 6c 3f 20 57 68 79 20 69 73 20 74  ptimal? Why is t
d040: 68 65 20 64 62 20 73 69 7a 65 20 69 6e 76 61 6c  he db size inval
d050: 69 64 61 74 65 64 20 68 65 72 65 20 0a 20 20 2a  idated here .  *
d060: 2a 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62  * when the datab
d070: 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  ase file is not 
d080: 75 6e 6c 6f 63 6b 65 64 3f 20 2a 2f 0a 20 20 70  unlocked? */.  p
d090: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
d0a0: 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  e = 0;.  sqlite3
d0b0: 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28 70  PcacheTruncate(p
d0c0: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
d0d0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
d0e0: 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b  .  if( !MEMDB ){
d0f0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
d100: 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  izeValid = 0;.  
d110: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  }..  return (rc=
d120: 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72  =SQLITE_OK?rc2:r
d130: 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  c);.}../*.** Par
d140: 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75 73  ameter aData mus
d150: 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
d160: 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70  fer of pPager->p
d170: 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a  ageSize bytes.**
d180: 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74   of data. Comput
d190: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63  e and return a c
d1a0: 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e  hecksum based on
d1b0: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
d1c0: 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f  f the .** page o
d1d0: 66 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 63  f data and the c
d1e0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
d1f0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
d200: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  t..**.** This is
d210: 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63   not a real chec
d220: 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c  ksum. It is real
d230: 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20  ly just the sum 
d240: 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f  of the .** rando
d250: 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  m initial value 
d260: 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  (pPager->cksumIn
d270: 69 74 29 20 61 6e 64 20 65 76 65 72 79 20 32 30  it) and every 20
d280: 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74  0th byte.** of t
d290: 68 65 20 70 61 67 65 20 64 61 74 61 2c 20 73 74  he page data, st
d2a0: 61 72 74 69 6e 67 20 77 69 74 68 20 62 79 74 65  arting with byte
d2b0: 20 6f 66 66 73 65 74 20 28 70 50 61 67 65 72 2d   offset (pPager-
d2c0: 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a  >pageSize%200)..
d2d0: 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69 73 20  ** Each byte is 
d2e0: 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
d2f0: 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64  n 8-bit unsigned
d300: 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   integer..**.** 
d310: 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72  Changing the for
d320: 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d  mula used to com
d330: 70 75 74 65 20 74 68 69 73 20 63 68 65 63 6b 73  pute this checks
d340: 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e  um results in an
d350: 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65  .** incompatible
d360: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
d370: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a  rmat..**.** If j
d380: 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f  ournal corruptio
d390: 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20  n occurs due to 
d3a0: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
d3b0: 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   the most likely
d3c0: 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73   .** scenario is
d3d0: 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72   that one end or
d3e0: 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
d3f0: 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  e record will be
d400: 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74   changed. .** It
d410: 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69   is much less li
d420: 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77  kely that the tw
d430: 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f  o ends of the jo
d440: 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c  urnal record wil
d450: 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20  l be.** correct 
d460: 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62  and the middle b
d470: 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73  e corrupt.  Thus
d480: 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d  , this "checksum
d490: 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f  " scheme,.** tho
d4a0: 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d  ugh fast and sim
d4b0: 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65  ple, catches the
d4c0: 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b   mostly likely k
d4d0: 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f  ind of corruptio
d4e0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  n..*/.static u32
d4f0: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67   pager_cksum(Pag
d500: 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
d510: 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20  t u8 *aData){.  
d520: 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67  u32 cksum = pPag
d530: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20  er->cksumInit;  
d540: 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
d550: 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75  um value to retu
d560: 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  rn */.  int i = 
d570: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
d580: 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f  -200;          /
d590: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
d5a0: 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29  /.  while( i>0 )
d5b0: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61  {.    cksum += a
d5c0: 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d  Data[i];.    i -
d5d0: 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74  = 200;.  }.  ret
d5e0: 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a  urn cksum;.}../*
d5f0: 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  .** Read a singl
d600: 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68  e page from eith
d610: 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  er the journal f
d620: 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72  ile (if isMainJr
d630: 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f  nl==1) or.** fro
d640: 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
d650: 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c  l (if isMainJrnl
d660: 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63  ==0) and playbac
d670: 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20  k that page..** 
d680: 54 68 65 20 70 61 67 65 20 62 65 67 69 6e 73 20  The page begins 
d690: 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73  at offset *pOffs
d6a0: 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  et into the file
d6b0: 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a  . The *pOffset.*
d6c0: 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65  * value is incre
d6d0: 61 73 65 64 20 74 6f 20 74 68 65 20 73 74 61 72  ased to the star
d6e0: 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  t of the next pa
d6f0: 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ge in the journa
d700: 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 4d  l..**.** The isM
d710: 61 69 6e 4a 72 6e 6c 20 66 6c 61 67 20 69 73 20  ainJrnl flag is 
d720: 74 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  true if this is 
d730: 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  the main rollbac
d740: 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a  k journal and.**
d750: 20 66 61 6c 73 65 20 66 6f 72 20 74 68 65 20 73   false for the s
d760: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
d770: 2e 20 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  .  The main roll
d780: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65  back journal use
d790: 73 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 73 20 2d  s.** checksums -
d7a0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
d7b0: 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 2e  ournal does not.
d7c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
d7d0: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
d7e0: 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65 61   page record rea
d7f0: 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
d800: 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
d810: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
d820: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
d830: 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69  ue of Pager.dbSi
d840: 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  ze, then playbac
d850: 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20  k is.** skipped 
d860: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  and SQLITE_OK is
d870: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
d880: 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74   If pDone is not
d890: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69   NULL, then it i
d8a0: 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61  s a record of pa
d8b0: 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61 6c  ges that have al
d8c0: 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c  ready.** been pl
d8d0: 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74  ayed back.  If t
d8e0: 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66  he page at *pOff
d8f0: 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  set has already 
d900: 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
d910: 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72  .** (if the corr
d920: 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20  esponding pDone 
d930: 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65 6e  bit is set) then
d940: 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61   skip the playba
d950: 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ck..** Make sure
d960: 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63   the pDone bit c
d970: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
d980: 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67  the *pOffset pag
d990: 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f  e is set.** prio
d9a0: 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a  r to returning..
d9b0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
d9c0: 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63 63  e record is succ
d9d0: 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
d9e0: 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
d9f0: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  rnal file.** and
da00: 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68   played back, th
da10: 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  en SQLITE_OK is 
da20: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
da30: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
da40: 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  ** while reading
da50: 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d   the record from
da60: 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
da70: 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65  al file or while
da80: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74   writing.** to t
da90: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
daa0: 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
dab0: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
dac0: 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a  rned. If data.**
dad0: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
dae0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
daf0: 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
db00: 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f  e but appears to
db10: 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64   be.** corrupted
db20: 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
db30: 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20   returned. Data 
db40: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  is considered co
db50: 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77  rrupted in.** tw
db60: 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a  o circumstances:
db70: 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74  .** .**   * If t
db80: 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e  he record page-n
db90: 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c  umber is illegal
dba0: 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f   (0 or PAGER_MJ_
dbb0: 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a  PGNO), or.**   *
dbc0: 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69   If the record i
dbd0: 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
dbe0: 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
dbf0: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  n journal file.*
dc00: 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 68  *     and the ch
dc10: 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65  ecksum field doe
dc20: 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
dc30: 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a  record content..
dc40: 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66  **.** Neither of
dc50: 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61   these two scena
dc60: 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c  rios are possibl
dc70: 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65 70  e during a savep
dc80: 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  oint rollback..*
dc90: 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20  *.** If this is 
dca0: 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
dcb0: 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72  back, then memor
dcc0: 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65  y may have to be
dcd0: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20   dynamically.** 
dce0: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
dcf0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74  s function. If t
dd00: 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20  his is the case 
dd10: 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f  and an allocatio
dd20: 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49  n fails,.** SQLI
dd30: 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
dd40: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
dd50: 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
dd60: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50  ck_one_page(.  P
dd70: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dd90: 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20  The pager being 
dda0: 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
ddb0: 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c   int isMainJrnl,
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ddd0: 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72  * 1 -> main jour
dde0: 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f  nal. 0 -> sub-jo
ddf0: 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20  urnal. */.  int 
de00: 69 73 55 6e 73 79 6e 63 2c 20 20 20 20 20 20 20  isUnsync,       
de10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
de20: 65 20 69 66 20 72 65 61 64 69 6e 67 20 66 72 6f  e if reading fro
de30: 6d 20 75 6e 73 79 6e 63 65 64 20 6d 61 69 6e 20  m unsynced main 
de40: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
de50: 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20 20 20   *pOffset,      
de60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
de70: 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64 20 74  fset of record t
de80: 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20  o playback */.  
de90: 69 6e 74 20 69 73 53 61 76 65 70 6e 74 2c 20 20  int isSavepnt,  
dea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
deb0: 20 54 72 75 65 20 66 6f 72 20 61 20 73 61 76 65   True for a save
dec0: 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a  point rollback *
ded0: 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
dee0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
def0: 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70    /* Bitvec of p
df00: 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61  ages already pla
df10: 79 65 64 20 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20  yed back */.){. 
df20: 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
df30: 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20   *pPg;          
df40: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
df50: 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
df60: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
df70: 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
df80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
df90: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
dfa0: 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75  of a page in jou
dfb0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
dfc0: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
dfd0: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
dfe0: 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e  sum used for san
dff0: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a  ity checking */.
e000: 20 20 75 38 20 2a 61 44 61 74 61 3b 20 20 20 20    u8 *aData;    
e010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e020: 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f  /* Temporary sto
e030: 72 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67  rage for the pag
e040: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
e050: 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20  ile *jfd;       
e060: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
e070: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
e080: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e090: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28   */..  assert( (
e0a0: 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d  isMainJrnl&~1)==
e0b0: 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d  0 );      /* isM
e0c0: 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20  ainJrnl is 0 or 
e0d0: 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  1 */.  assert( (
e0e0: 69 73 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30  isSavepnt&~1)==0
e0f0: 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69 73 53   );       /* isS
e100: 61 76 65 70 6e 74 20 69 73 20 30 20 6f 72 20 31  avepnt is 0 or 1
e110: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
e120: 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e  MainJrnl || pDon
e130: 65 20 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e  e );     /* pDon
e140: 65 20 61 6c 77 61 79 73 20 75 73 65 64 20 6f 6e  e always used on
e150: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
e160: 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76  .  assert( isSav
e170: 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30  epnt || pDone==0
e180: 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e   );   /* pDone n
e190: 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e  ever used on non
e1a0: 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20  -savepoint */.. 
e1b0: 20 61 44 61 74 61 20 3d 20 28 75 38 2a 29 70 50   aData = (u8*)pP
e1c0: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
e1d0: 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61  .  assert( aData
e1e0: 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   );         /* T
e1f0: 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74  emp storage must
e200: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
e210: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  en allocated */.
e220: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70  .  /* Read the p
e230: 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70  age number and p
e240: 61 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68  age data from th
e250: 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62  e journal or sub
e260: 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69  -journal.  ** fi
e270: 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  le. Return an er
e280: 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
e290: 63 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20  caller if an IO 
e2a0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20  error occurs..  
e2b0: 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69  */.  jfd = isMai
e2c0: 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e  nJrnl ? pPager->
e2d0: 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a  jfd : pPager->sj
e2e0: 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33  fd;.  rc = read3
e2f0: 32 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66  2bits(jfd, *pOff
e300: 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69  set, &pgno);.  i
e310: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e320: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
e330: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
e340: 61 64 28 6a 66 64 2c 20 61 44 61 74 61 2c 20 70  ad(jfd, aData, p
e350: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
e360: 20 28 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a   (*pOffset)+4);.
e370: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e380: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
e390: 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70  .  *pOffset += p
e3a0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
e3b0: 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c  + 4 + isMainJrnl
e3c0: 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79  *4;..  /* Sanity
e3d0: 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65   checking on the
e3e0: 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20   page.  This is 
e3f0: 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74  more important t
e400: 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79  hat I originally
e410: 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20  .  ** thought.  
e420: 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
e430: 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  re occurs while 
e440: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
e450: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20  eing written,.  
e460: 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73  ** it could caus
e470: 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74  e invalid data t
e480: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
e490: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  o the journal.  
e4a0: 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20  We need to.  ** 
e4b0: 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61  detect this inva
e4c0: 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68  lid data (with h
e4d0: 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29  igh probability)
e4e0: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
e4f0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
e500: 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
e510: 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
e520: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
e530: 20 21 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20   !isSavepnt );. 
e540: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e550: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28  _DONE;.  }.  if(
e560: 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67   pgno>(Pgno)pPag
e570: 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71  er->dbSize || sq
e580: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
e590: 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a  pDone, pgno) ){.
e5a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e5b0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
e5c0: 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20  isMainJrnl ){.  
e5d0: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
e5e0: 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74  s(jfd, (*pOffset
e5f0: 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20  )-4, &cksum);.  
e600: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
e610: 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69  n rc;.    if( !i
e620: 73 53 61 76 65 70 6e 74 20 26 26 20 70 61 67 65  sSavepnt && page
e630: 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
e640: 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
e650: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
e660: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
e670: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 44 6f 6e  .  }..  if( pDon
e680: 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74  e && (rc = sqlit
e690: 65 33 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e  e3BitvecSet(pDon
e6a0: 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54  e, pgno))!=SQLIT
e6b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
e6c0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73  rn rc;.  }..  as
e6d0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
e6e0: 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
e6f0: 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  VED || pPager->s
e700: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
e710: 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49  USIVE );..  /* I
e720: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
e730: 6e 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65  n RESERVED state
e740: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
e750: 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74  t be a copy of t
e760: 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  his.  ** page in
e770: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
e780: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
e790: 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70  ust update the p
e7a0: 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a  ager cache,.  **
e7b0: 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
e7c0: 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  e file. The page
e7d0: 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20   is left marked 
e7e0: 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61  dirty in this ca
e7f0: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  se..  **.  ** An
e800: 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68   exception to th
e810: 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66  e above rule: If
e820: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
e830: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
e840: 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65  .  ** and a page
e850: 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67   is moved during
e860: 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
e870: 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20  vacuum then the 
e880: 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f  page may.  ** no
e890: 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65  t be in the page
e8a0: 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20  r cache. Later: 
e8b0: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  if a malloc() or
e8c0: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
e8d0: 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d  .  ** during a M
e8e0: 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20  ovepage() call, 
e8f0: 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
e900: 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  y not be in the 
e910: 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65  cache.  ** eithe
e920: 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74  r. So the condit
e930: 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e  ion described in
e940: 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67   the above parag
e950: 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  raph is not.  **
e960: 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20   assert()able.. 
e970: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45   **.  ** If in E
e980: 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20  XCLUSIVE state, 
e990: 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74  then we update t
e9a0: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69  he pager cache i
e9b0: 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a  f it exists.  **
e9c0: 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69   and the main fi
e9d0: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
e9e0: 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20  then marked not 
e9f0: 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dirty..  **.  **
ea00: 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20   Ticket #1171:  
ea10: 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  The statement jo
ea20: 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
ea30: 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ain page content
ea40: 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69   that is.  ** di
ea50: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
ea60: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74   page content at
ea70: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
ea80: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
ea90: 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20   ** This occurs 
eaa0: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63  when a page is c
eab0: 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20  hanged prior to 
eac0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73  the start of a s
ead0: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
eae0: 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e  en changed again
eaf0: 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
eb00: 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c  ement.  When rol
eb10: 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61  ling back such a
eb20: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
eb30: 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74  we must not writ
eb40: 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  e to the origina
eb50: 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73  l database unles
eb60: 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66  s we know.  ** f
eb70: 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  or certain that 
eb80: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
eb90: 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65  ntents are synce
eba0: 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  d into the main 
ebb0: 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
ebc0: 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73  urnal.  Otherwis
ebd0: 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  e, a power loss 
ebe0: 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69  might leave modi
ebf0: 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65  fied data in the
ec00: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
ec10: 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65  ile without an e
ec20: 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c  ntry in the roll
ec30: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61  back journal tha
ec40: 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f  t can.  ** resto
ec50: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
ec60: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
ec70: 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69  form.  Two condi
ec80: 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20  tions must be.  
ec90: 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72  ** met before wr
eca0: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
ecb0: 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29  abase files. (1)
ecc0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
ecd0: 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65  st be.  ** locke
ece0: 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20  d.  (2) we know 
ecf0: 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
ed00: 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  l page content i
ed10: 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20  s fully synced. 
ed20: 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   ** in the main 
ed30: 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62  journal either b
ed40: 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
ed50: 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
ed60: 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65  or else.  ** the
ed70: 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
ed80: 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a  as needSync==0..
ed90: 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30    **.  ** 2008-0
eda0: 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65  4-14:  When atte
edb0: 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d  mpting to vacuum
edc0: 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
edd0: 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a  ase file, it.  *
ede0: 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  * is possible to
edf0: 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e   fail a statemen
ee00: 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20  t on a database 
ee10: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65  that does not ye
ee20: 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f  t exist..  ** Do
ee30: 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
ee40: 77 72 69 74 65 20 69 66 20 64 61 74 61 62 61 73  write if databas
ee50: 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72  e file has never
ee60: 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20   been opened..  
ee70: 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72  */.  pPg = pager
ee80: 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
ee90: 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  pgno);.  assert(
eea0: 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29   pPg || !MEMDB )
eeb0: 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
eec0: 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67  "PLAYBACK %d pag
eed0: 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 20  e %d hash(%08x) 
eee0: 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
eef0: 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
ef00: 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67  ager), pgno, pag
ef10: 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67  er_datahash(pPag
ef20: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 61 44  er->pageSize, aD
ef30: 61 74 61 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ata),.          
ef40: 20 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c       (isMainJrnl
ef50: 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a  ?"main-journal":
ef60: 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20  "sub-journal"). 
ef70: 20 29 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67   ));.  if( (pPag
ef80: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
ef90: 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 26  _EXCLUSIVE).   &
efa0: 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d  & (pPg==0 || 0==
efb0: 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
efc0: 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29 0a 20 20  R_NEED_SYNC)).  
efd0: 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
efe0: 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 21 69 73  r->fd).   && !is
eff0: 55 6e 73 79 6e 63 0a 20 20 29 7b 0a 20 20 20 20  Unsync.  ){.    
f000: 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f  i64 ofst = (pgno
f010: 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
f020: 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72  >pageSize;.    r
f030: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
f040: 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61  te(pPager->fd, a
f050: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
f060: 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20  geSize, ofst);. 
f070: 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
f080: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
f090: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
f0a0: 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e  dbFileSize = pgn
f0b0: 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  o;.    }.    sql
f0c0: 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
f0d0: 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
f0e0: 2c 20 70 67 6e 6f 2c 20 61 44 61 74 61 29 3b 0a  , pgno, aData);.
f0f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d    }else if( !isM
f100: 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d  ainJrnl && pPg==
f110: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  0 ){.    /* If t
f120: 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63  his is a rollbac
f130: 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74  k of a savepoint
f140: 20 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f   and data was no
f150: 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20  t written to.   
f160: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
f170: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
f180: 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20   not in-memory, 
f190: 74 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e  there is a poten
f1a0: 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62  tial.    ** prob
f1b0: 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61  lem. When the pa
f1c0: 67 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68  ge is next fetch
f1d0: 65 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65  ed by the b-tree
f1e0: 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20   layer, it .    
f1f0: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20  ** will be read 
f200: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
f210: 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61  e file, which ma
f220: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
f230: 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e  .    ** current.
f240: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
f250: 54 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70  There are a coup
f260: 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20  le of different 
f270: 77 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61  ways this can ha
f280: 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75  ppen. All are qu
f290: 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75  ite.    ** obscu
f2a0: 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67  re. When running
f2b0: 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   in synchronous 
f2c0: 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f  mode, this can o
f2d0: 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20  nly happen .    
f2e0: 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ** if the page i
f2f0: 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  s on the free-li
f300: 73 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  st at the start 
f310: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
f320: 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
f330: 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20  populated, then 
f340: 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69  moved using sqli
f350: 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
f360: 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
f370: 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69  * The solution i
f380: 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d  s to add an in-m
f390: 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68  emory page to th
f3a0: 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69  e cache containi
f3b0: 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  ng.    ** the da
f3c0: 74 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ta just read fro
f3d0: 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
f3e0: 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  l. Mark the page
f3f0: 20 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a   as dirty .    *
f400: 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67  * and if the pag
f410: 65 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f  er requires a jo
f420: 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e  urnal-sync, then
f430: 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
f440: 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  s .    ** requir
f450: 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79  ing a journal-sy
f460: 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20  nc before it is 
f470: 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a  written..    */.
f480: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61      assert( isSa
f490: 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 69 66 28  vepnt );.    if(
f4a0: 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61   (rc = sqlite3Pa
f4b0: 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67 65  gerAcquire(pPage
f4c0: 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31  r, pgno, &pPg, 1
f4d0: 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))!=SQLITE_OK ){
f4e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
f4f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
f500: 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52  >flags &= ~PGHDR
f510: 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20  _NEED_READ;.    
f520: 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
f530: 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d  eDirty(pPg);.  }
f540: 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
f550: 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f    /* No page sho
f560: 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c  uld ever be expl
f570: 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61  icitly rolled ba
f580: 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73  ck that is in us
f590: 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  e, except.    **
f5a0: 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63   for page 1 whic
f5b0: 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65  h is held in use
f5c0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
f5d0: 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  p the lock on th
f5e0: 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
f5f0: 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65  e active. Howeve
f600: 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61  r such a page ma
f610: 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y be rolled back
f620: 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20   as a result.   
f630: 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e   ** of an intern
f640: 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69  al error resulti
f650: 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74  ng in an automat
f660: 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ic call to.    *
f670: 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  * sqlite3PagerRo
f680: 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f  llback()..    */
f690: 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61  .    void *pData
f6a0: 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70 50  ;.    pData = pP
f6b0: 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65  g->pData;.    me
f6c0: 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44 61 74  mcpy(pData, aDat
f6d0: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
f6e0: 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ize);.    if( pP
f6f0: 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
f700: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
f710: 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b  >xReiniter(pPg);
f720: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
f730: 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69  sMainJrnl && (!i
f740: 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66  sSavepnt || *pOf
f750: 66 73 65 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f  fset<=pPager->jo
f760: 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20 20  urnalHdr) ){.   
f770: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e     /* If the con
f780: 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61  tents of this pa
f790: 67 65 20 77 65 72 65 20 6a 75 73 74 20 72 65 73  ge were just res
f7a0: 74 6f 72 65 64 20 66 72 6f 6d 20 74 68 65 20 6d  tored from the m
f7b0: 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f  ain .      ** jo
f7c0: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
f7d0: 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73   its content mus
f7e0: 74 20 62 65 20 61 73 20 74 68 65 79 20 77 65 72  t be as they wer
f7f0: 65 20 77 68 65 6e 20 74 68 65 20 0a 20 20 20 20  e when the .    
f800: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
f810: 20 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65   was first opene
f820: 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
f830: 77 65 20 63 61 6e 20 6d 61 72 6b 20 74 68 65 20  we can mark the 
f840: 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 61 73  page.      ** as
f850: 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74 68   clean, since th
f860: 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e  ere will be no n
f870: 65 65 64 20 74 6f 20 77 72 69 74 65 20 69 74 20  eed to write it 
f880: 6f 75 74 20 74 6f 20 74 68 65 2e 0a 20 20 20 20  out to the..    
f890: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
f8a0: 65 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65 70  ere is one excep
f8b0: 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75 6c  tion to this rul
f8c0: 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69  e. If the page i
f8d0: 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20  s being rolled. 
f8e0: 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73 20       ** back as 
f8f0: 70 61 72 74 20 6f 66 20 61 20 73 61 76 65 70 6f  part of a savepo
f900: 69 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65 6e  int (or statemen
f910: 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d  t) rollback from
f920: 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e   an .      ** un
f930: 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f  synced portion o
f940: 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
f950: 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  al file, then it
f960: 20 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20 20   is not safe.   
f970: 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68     ** to mark th
f980: 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
f990: 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
f9a0: 20 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61 67   marking the pag
f9b0: 65 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c  e as.      ** cl
f9c0: 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20 74  ean will clear t
f9d0: 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
f9e0: 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20 74  NC flag. Since t
f9f0: 68 65 20 70 61 67 65 20 69 73 0a 20 20 20 20 20  he page is.     
fa00: 20 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74   ** already in t
fa10: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
fa20: 28 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61 67  (recorded in Pag
fa30: 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61  er.pInJournal) a
fa40: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nd.      ** the 
fa50: 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
fa60: 66 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 2c  flag is cleared,
fa70: 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
fa80: 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 20  written to.     
fa90: 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69 6e   ** again within
faa0: 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
fab0: 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d 61  n, it will be ma
fac0: 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 62 75  rked as dirty bu
fad0: 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50  t.      ** the P
fae0: 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
faf0: 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  lag will not be 
fb00: 73 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74 68  set. It could th
fb10: 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20  en potentially. 
fb20: 20 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74 74       ** be writt
fb30: 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65 20  en out into the 
fb40: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
fb50: 66 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c  fore its journal
fb60: 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73   file.      ** s
fb70: 65 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65 64  egment is synced
fb80: 2e 20 49 66 20 61 20 63 72 61 73 68 20 6f 63 63  . If a crash occ
fb90: 75 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66 6f  urs during or fo
fba0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20 20  llowing this,.  
fbb0: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
fbc0: 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 65  corruption may e
fbd0: 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  nsue..      */. 
fbe0: 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
fbf0: 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29  heMakeClean(pPg)
fc00: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
fc10: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
fc20: 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
fc30: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
fc40: 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
fc50: 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  f.    /* If this
fc60: 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65   was page 1, the
fc70: 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61  n restore the va
fc80: 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46  lue of Pager.dbF
fc90: 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20  ileVers..    ** 
fca0: 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 61  Do this before a
fcb0: 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a  ny decoding. */.
fcc0: 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20      if( pgno==1 
fcd0: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
fce0: 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
fcf0: 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74  ers, &((u8*)pDat
fd00: 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50  a)[24],sizeof(pP
fd10: 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
fd20: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
fd30: 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61 67  * Decode the pag
fd40: 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  e just read from
fd50: 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44   disk */.    COD
fd60: 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC1(pPager, pDat
fd70: 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c  a, pPg->pgno, 3,
fd80: 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   rc=SQLITE_NOMEM
fd90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  );.    sqlite3Pc
fda0: 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29  acheRelease(pPg)
fdb0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
fdc0: 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  c;.}..#if !defin
fdd0: 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65  ed(NDEBUG) || de
fde0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56  fined(SQLITE_COV
fdf0: 45 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  ERAGE_TEST)./*.*
fe00: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6c  * This routine l
fe10: 6f 6f 6b 73 20 61 68 65 61 64 20 69 6e 74 6f 20  ooks ahead into 
fe20: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
fe30: 20 66 69 6c 65 20 61 6e 64 20 64 65 74 65 72 6d   file and determ
fe40: 69 6e 65 73 0a 2a 2a 20 77 68 65 74 68 65 72 20  ines.** whether 
fe50: 6f 72 20 6e 6f 74 20 74 68 65 20 6e 65 78 74 20  or not the next 
fe60: 72 65 63 6f 72 64 20 28 74 68 65 20 72 65 63 6f  record (the reco
fe70: 72 64 20 74 68 61 74 20 62 65 67 69 6e 73 20 61  rd that begins a
fe80: 74 20 66 69 6c 65 0a 2a 2a 20 6f 66 66 73 65 74  t file.** offset
fe90: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fea0: 4f 66 66 29 20 69 73 20 61 20 77 65 6c 6c 2d 66  Off) is a well-f
feb0: 6f 72 6d 65 64 20 70 61 67 65 20 72 65 63 6f 72  ormed page recor
fec0: 64 20 63 6f 6e 73 69 73 74 69 6e 67 0a 2a 2a 20  d consisting.** 
fed0: 6f 66 20 61 20 76 61 6c 69 64 20 70 61 67 65 20  of a valid page 
fee0: 6e 75 6d 62 65 72 2c 20 70 50 61 67 65 2d 3e 70  number, pPage->p
fef0: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
ff00: 20 63 6f 6e 74 65 6e 74 2c 20 66 6f 6c 6c 6f 77   content, follow
ff10: 65 64 0a 2a 2a 20 62 79 20 61 20 76 61 6c 69 64  ed.** by a valid
ff20: 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a   checksum..**.**
ff30: 20 54 68 65 20 70 61 67 65 72 20 6e 65 76 65 72   The pager never
ff40: 20 6e 65 65 64 73 20 74 6f 20 6b 6e 6f 77 20 74   needs to know t
ff50: 68 69 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  his in order to 
ff60: 64 6f 20 69 74 73 20 6a 6f 62 2e 20 20 20 54 68  do its job.   Th
ff70: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
ff80: 20 6f 6e 6c 79 20 75 73 65 64 20 66 72 6f 6d 20   only used from 
ff90: 77 69 74 68 20 61 73 73 65 72 74 28 29 20 61 6e  with assert() an
ffa0: 64 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63  d testcase() mac
ffb0: 72 6f 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ros..*/.static i
ffc0: 6e 74 20 70 61 67 65 72 4e 65 78 74 4a 6f 75 72  nt pagerNextJour
ffd0: 6e 61 6c 50 61 67 65 49 73 56 61 6c 69 64 28 50  nalPageIsValid(P
ffe0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
fff0: 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
10000 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
10010 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
10020 70 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 63 6b  page */.  u32 ck
10030 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  sum;           /
10040 2a 20 54 68 65 20 70 61 67 65 20 63 68 65 63 6b  * The page check
10050 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  sum */.  int rc;
10060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10070 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
10080 6d 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  m read operation
10090 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  s */.  sqlite3_f
100a0 69 6c 65 20 2a 66 64 3b 20 20 20 20 2f 2a 20 54  ile *fd;    /* T
100b0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
100c0 6f 72 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65  or from which we
100d0 20 61 72 65 20 72 65 61 64 69 6e 67 20 2a 2f 0a   are reading */.
100e0 20 20 75 38 20 2a 61 44 61 74 61 3b 20 20 20 20    u8 *aData;    
100f0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
10100 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  t of the page */
10110 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
10120 70 61 67 65 20 6e 75 6d 62 65 72 20 68 65 61 64  page number head
10130 65 72 20 2a 2f 0a 20 20 66 64 20 3d 20 70 50 61  er */.  fd = pPa
10140 67 65 72 2d 3e 6a 66 64 3b 0a 20 20 72 63 20 3d  ger->jfd;.  rc =
10150 20 72 65 61 64 33 32 62 69 74 73 28 66 64 2c 20   read32bits(fd, 
10160 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10170 66 66 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66  ff, &pgno);.  if
10180 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10190 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 20 20  ){ return 0; }  
101a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101c0 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 69 66  /*NO_TEST*/.  if
101d0 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  ( pgno==0 || pgn
101e0 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
101f0 28 70 50 61 67 65 72 29 20 29 7b 20 72 65 74 75  (pPager) ){ retu
10200 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20  rn 0; }         
10210 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 69 66  /*NO_TEST*/.  if
10220 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61  ( pgno>(Pgno)pPa
10230 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 20 72  ger->dbSize ){ r
10240 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20 20 20  eturn 0; }      
10250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10260 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 0a 20 20 2f  /*NO_TEST*/..  /
10270 2a 20 52 65 61 64 20 74 68 65 20 63 68 65 63 6b  * Read the check
10280 73 75 6d 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65  sum */.  rc = re
10290 61 64 33 32 62 69 74 73 28 66 64 2c 20 70 50 61  ad32bits(fd, pPa
102a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
102b0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
102c0 2b 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69  +4, &cksum);.  i
102d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
102e0 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 20   ){ return 0; } 
102f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10310 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 0a 20 20   /*NO_TEST*/..  
10320 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
10330 20 61 6e 64 20 76 65 72 69 66 79 20 74 68 65 20   and verify the 
10340 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 61 44  checksum */.  aD
10350 61 74 61 20 3d 20 28 75 38 2a 29 70 50 61 67 65  ata = (u8*)pPage
10360 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
10370 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
10380 61 64 28 66 64 2c 20 61 44 61 74 61 2c 20 70 50  ad(fd, aData, pP
10390 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
103a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
103b0 66 66 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21  ff+4);.  if( rc!
103c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 72 65  =SQLITE_OK ){ re
103d0 74 75 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20  turn 0; }       
103e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f             /*NO_
10400 54 45 53 54 2a 2f 0a 20 20 69 66 28 20 70 61 67  TEST*/.  if( pag
10410 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
10420 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29   aData)!=cksum )
10430 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 20 20 20  { return 0; }   
10440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f             /*NO_
10450 54 45 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61  TEST*/..  /* Rea
10460 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20 6f 6e  ch this point on
10470 6c 79 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ly if the page i
10480 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 72 65 74  s valid */.  ret
10490 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
104a0 2f 2a 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  /* !defined(NDEB
104b0 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
104c0 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54  QLITE_COVERAGE_T
104d0 45 53 54 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50  EST) */../*.** P
104e0 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72  arameter zMaster
104f0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
10500 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
10510 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20   file. A single 
10520 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
10530 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f  that referred to
10540 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
10550 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73  nal file has jus
10560 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  t been rolled ba
10570 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ck..** This rout
10580 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74  ine checks if it
10590 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
105a0 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
105b0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a  r journal file,.
105c0 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69  ** and does so i
105d0 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41  f it is..**.** A
105e0 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20  rgument zMaster 
105f0 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67  may point to Pag
10600 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f  er.pTmpSpace. So
10610 20 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20   that buffer is 
10620 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  not .** availabl
10630 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e  e for use within
10640 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
10650 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73  **.** When a mas
10660 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
10670 20 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20   is created, it 
10680 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
10690 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20  h the names .** 
106a0 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68  of all of its ch
106b0 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e  ild journals, on
106c0 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c  e after another,
106d0 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74   formatted as ut
106e0 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20  f-8 .** encoded 
106f0 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66  text. The end of
10700 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   each child jour
10710 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b  nal file is mark
10720 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75  ed with a .** nu
10730 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
10740 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74  e (0x00). i.e. t
10750 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
10760 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ts of a master j
10770 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66  ournal.** file f
10780 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
10790 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64   involving two d
107a0 61 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62  atabases might b
107b0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d  e:.**.**   "/hom
107c0 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72  e/bill/a.db-jour
107d0 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c  nal\x00/home/bil
107e0 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/b.db-journal\x
107f0 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74  00".**.** A mast
10800 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
10810 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65  may only be dele
10820 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20  ted once all of 
10830 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f  its child .** jo
10840 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e  urnals have been
10850 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
10860 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
10870 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74  n reads the cont
10880 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74  ents of the mast
10890 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er-journal file 
108a0 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20  into .** memory 
108b0 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67  and loops throug
108c0 68 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68  h each of the ch
108d0 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ild journal name
108e0 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63  s. For.** each c
108f0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  hild journal, it
10900 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a   checks if:.**.*
10910 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69  *   * if the chi
10920 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  ld journal exist
10930 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20  s, and if so.** 
10940 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64    * if the child
10950 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e   journal contain
10960 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
10970 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10980 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61  .**     file zMa
10990 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ster.**.** If a 
109a0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61  child journal ca
109b0 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20  n be found that 
109c0 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20  matches both of 
109d0 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20  the criteria.** 
109e0 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63  above, this func
109f0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74  tion returns wit
10a00 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
10a10 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ing. Otherwise, 
10a20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68  if.** no such ch
10a30 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ild journal can 
10a40 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a  be found, file z
10a50 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65  Master is delete
10a60 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69  d from.** the fi
10a70 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20  le-system using 
10a80 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
10a90 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  )..**.** If an I
10aa0 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74  O error within t
10ab0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e  his function, an
10ac0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
10ad0 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a  eturned. This.**
10ae0 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
10af0 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61  tes memory by ca
10b00 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c  lling sqlite3Mal
10b10 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c  loc(). If an all
10b20 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73  ocation.** fails
10b30 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  , SQLITE_NOMEM i
10b40 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
10b50 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20  rwise, if no IO 
10b60 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  or malloc errors
10b70 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49   .** occur, SQLI
10b80 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
10b90 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54  d..**.** TODO: T
10ba0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  his function all
10bb0 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20  ocates a single 
10bc0 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20  block of memory 
10bd0 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65  to load.** the e
10be0 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
10bf0 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
10c00 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
10c10 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f  could be.** a co
10c20 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65  uple of kilobyte
10c30 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74  s or so - potent
10c40 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61  ially larger tha
10c50 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73  n the page .** s
10c60 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
10c70 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74  nt pager_delmast
10c80 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
10c90 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
10ca0 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  aster){.  sqlite
10cb0 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
10cc0 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
10cd0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
10ce0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
10cf0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
10d00 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65  te3_file *pMaste
10d10 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27  r;    /* Malloc'
10d20 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  d master-journal
10d30 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
10d40 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
10d50 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20  le *pJournal;   
10d60 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c  /* Malloc'd chil
10d70 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  d-journal file d
10d80 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63  escriptor */.  c
10d90 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72  har *zMasterJour
10da0 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74  nal = 0; /* Cont
10db0 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ents of master j
10dc0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
10dd0 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72   i64 nMasterJour
10de0 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  nal;       /* Si
10df0 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ze of master jou
10e00 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  rnal file */..  
10e10 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
10e20 65 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70  e for both the p
10e30 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73  Journal and pMas
10e40 74 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  ter file descrip
10e50 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75  tors..  ** If su
10e60 63 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74  ccessful, open t
10e70 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10e80 6c 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69  l file for readi
10e90 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74  ng..  */.  pMast
10ea0 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  er = (sqlite3_fi
10eb0 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  le *)sqlite3Mall
10ec0 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f  ocZero(pVfs->szO
10ed0 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a  sFile * 2);.  pJ
10ee0 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65  ournal = (sqlite
10ef0 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a  3_file *)(((u8 *
10f00 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73  )pMaster) + pVfs
10f10 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69  ->szOsFile);.  i
10f20 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20  f( !pMaster ){. 
10f30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
10f40 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
10f50 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61     const int fla
10f60 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs = (SQLITE_OPE
10f70 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
10f80 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
10f90 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d  URNAL);.    rc =
10fa0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
10fb0 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d  Vfs, zMaster, pM
10fc0 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29  aster, flags, 0)
10fd0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
10fe0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
10ff0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
11000 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
11010 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65  sFileSize(pMaste
11020 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  r, &nMasterJourn
11030 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  al);.  if( rc!=S
11040 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
11050 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
11060 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75    if( nMasterJou
11070 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68  rnal>0 ){.    ch
11080 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20  ar *zJournal;.  
11090 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50    char *zMasterP
110a0 74 72 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  tr = 0;.    int 
110b0 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66  nMasterPtr = pVf
110c0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
110d0 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68  ..    /* Load th
110e0 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
110f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
11100 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
11110 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c   from.    ** sql
11120 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e  ite3_malloc() an
11130 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  d pointed to by 
11140 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20  zMasterJournal. 
11150 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73  .    */.    zMas
11160 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68  terJournal = (ch
11170 61 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  ar *)sqlite3Mall
11180 6f 63 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a  oc((int)nMasterJ
11190 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72  ournal + nMaster
111a0 50 74 72 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  Ptr);.    if( !z
111b0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
111c0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
111d0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
111e0 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
111f0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d  ut;.    }.    zM
11200 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73  asterPtr = &zMas
11210 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74  terJournal[nMast
11220 65 72 4a 6f 75 72 6e 61 6c 5d 3b 0a 20 20 20 20  erJournal];.    
11230 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
11240 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73  ad(pMaster, zMas
11250 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74  terJournal, (int
11260 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c  )nMasterJournal,
11270 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
11280 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
11290 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
112a0 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d  ..    zJournal =
112b0 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   zMasterJournal;
112c0 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f  .    while( (zJo
112d0 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75  urnal-zMasterJou
112e0 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75  rnal)<nMasterJou
112f0 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e  rnal ){.      in
11300 74 20 65 78 69 73 74 73 3b 0a 20 20 20 20 20 20  t exists;.      
11310 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
11320 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72  cess(pVfs, zJour
11330 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  nal, SQLITE_ACCE
11340 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73  SS_EXISTS, &exis
11350 74 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ts);.      if( r
11360 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11370 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
11380 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
11390 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 78    }.      if( ex
113a0 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ists ){.        
113b0 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  /* One of the jo
113c0 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74  urnals pointed t
113d0 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20  o by the master 
113e0 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a  journal exists..
113f0 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20          ** Open 
11400 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20  it and check if 
11410 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  it points at the
11420 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
11430 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 73   If.        ** s
11440 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  o, return withou
11450 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d  t deleting the m
11460 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
11470 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  le..        */. 
11480 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20         int c;.  
11490 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20        int flags 
114a0 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
114b0 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
114c0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
114d0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
114e0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
114f0 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a  fs, zJournal, pJ
11500 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30  ournal, flags, 0
11510 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
11520 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11530 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
11540 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
11550 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
11560 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
11570 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c  Journal(pJournal
11580 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d  , zMasterPtr, nM
11590 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20  asterPtr);.     
115a0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
115b0 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  e(pJournal);.   
115c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
115d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
115e0 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
115f0 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
11600 7d 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a  }..        c = z
11610 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20  MasterPtr[0]!=0 
11620 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65  && strcmp(zMaste
11630 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d  rPtr, zMaster)==
11640 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  0;.        if( c
11650 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
11660 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68   We have a match
11670 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  . Do not delete 
11680 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
11690 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
116a0 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
116b0 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
116c0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
116d0 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73    zJournal += (s
116e0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
116f0 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20  Journal)+1);.   
11700 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72 63 20 3d   }.  }.  .  rc =
11710 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
11720 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
11730 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f  0);..delmaster_o
11740 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74 65  ut:.  if( zMaste
11750 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
11760 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61  sqlite3_free(zMa
11770 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
11780 7d 20 20 0a 20 20 69 66 28 20 70 4d 61 73 74 65  }  .  if( pMaste
11790 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
117a0 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29  OsClose(pMaster)
117b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69  ;.    assert( !i
117c0 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20  sOpen(pJournal) 
117d0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
117e0 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  _free(pMaster);.
117f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11800 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
11810 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
11820 63 68 61 6e 67 65 20 74 68 65 20 61 63 74 75 61  change the actua
11830 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  l size of the da
11840 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
11850 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
11860 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61  em. This only ha
11870 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69  ppens when commi
11880 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
11890 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69  ion,.** or rolli
118a0 6e 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61  ng back a transa
118b0 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67  ction (including
118c0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
118d0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a  hot-journal)..**
118e0 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20  .** If the main 
118f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
11900 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 61 6e   not open, or an
11910 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
11920 69 73 20 6e 6f 74 0a 2a 2a 20 68 65 6c 64 2c 20  is not.** held, 
11930 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
11940 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77   a no-op. Otherw
11950 69 73 65 2c 20 74 68 65 20 73 69 7a 65 20 6f 66  ise, the size of
11960 20 74 68 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20   the file is.** 
11970 63 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65  changed to nPage
11980 20 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50   pages (nPage*pP
11990 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
119a0 79 74 65 73 29 2e 20 49 66 20 74 68 65 20 66 69  ytes). If the fi
119b0 6c 65 0a 2a 2a 20 6f 6e 20 64 69 73 6b 20 69 73  le.** on disk is
119c0 20 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65   currently large
119d0 72 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67  r than nPage pag
119e0 65 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65  es, then use the
119f0 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74   VFS.** xTruncat
11a00 65 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72  e() method to tr
11a10 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  uncate it..**.**
11a20 20 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 6d 69   Or, it might mi
11a30 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20  ght be the case 
11a40 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e  that the file on
11a50 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72   disk is smaller
11a60 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20   than .** nPage 
11a70 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72  pages. Some oper
11a80 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70  ating system imp
11a90 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e  lementations can
11aa0 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66   get confused if
11ab0 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f 20   .** you try to 
11ac0 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20  truncate a file 
11ad0 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61  to some size tha
11ae0 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  t is larger than
11af0 20 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   it .** currentl
11b00 79 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74 20  y is, so detect 
11b10 74 68 69 73 20 63 61 73 65 20 61 6e 64 20 77 72  this case and wr
11b20 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72  ite a single zer
11b30 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68  o byte to .** th
11b40 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77  e end of the new
11b50 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a   file instead..*
11b60 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
11b70 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ul, return SQLIT
11b80 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65  E_OK. If an IO e
11b90 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
11ba0 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74  e modifying.** t
11bb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11bc0 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  , return the err
11bd0 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
11be0 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aller..*/.static
11bf0 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63   int pager_trunc
11c00 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
11c10 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  r, Pgno nPage){.
11c20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11c30 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
11c40 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
11c50 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 69 73  _EXCLUSIVE && is
11c60 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
11c70 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72   ){.    i64 curr
11c80 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65  entSize, newSize
11c90 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49  ;.    /* TODO: I
11ca0 73 20 69 74 20 73 61 66 65 20 74 6f 20 75 73 65  s it safe to use
11cb0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a   Pager.dbFileSiz
11cc0 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72  e here? */.    r
11cd0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
11ce0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
11cf0 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b  , &currentSize);
11d00 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 70  .    newSize = p
11d10 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a  Pager->pageSize*
11d20 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20  (i64)nPage;.    
11d30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
11d40 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65  K && currentSize
11d50 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  !=newSize ){.   
11d60 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53 69     if( currentSi
11d70 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  ze>newSize ){.  
11d80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
11d90 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
11da0 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65  ger->fd, newSize
11db0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
11dc0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
11dd0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
11de0 65 72 2d 3e 66 64 2c 20 22 22 2c 20 31 2c 20 6e  er->fd, "", 1, n
11df0 65 77 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20  ewSize-1);.     
11e00 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
11e10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11e20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
11e30 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65  FileSize = nPage
11e40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11e50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
11e60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
11e70 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
11e80 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
11e90 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65  variable for the
11ea0 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20   given.** pager 
11eb0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c  based on the val
11ec0 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
11ed0 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d  he xSectorSize m
11ee0 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20  ethod.** of the 
11ef0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
11f00 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73  le. The sector s
11f10 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ize will be used
11f20 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74   used .** to det
11f30 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20  ermine the size 
11f40 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  and alignment of
11f50 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
11f60 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a  and .** master j
11f70 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20  ournal pointers 
11f80 77 69 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a  within created j
11f90 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a  ournal files..**
11fa0 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  .** For temporar
11fb0 79 20 66 69 6c 65 73 20 74 68 65 20 65 66 66 65  y files the effe
11fc0 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
11fd0 65 20 69 73 20 61 6c 77 61 79 73 20 35 31 32 20  e is always 512 
11fe0 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  bytes..**.** Oth
11ff0 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d  erwise, for non-
12000 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c  temporary files,
12010 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
12020 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a  ector size is.**
12030 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
12040 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74  ned by the xSect
12050 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20  orSize() method 
12060 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 35 31  rounded up to 51
12070 32 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65  2 if.** it is le
12080 73 73 20 74 68 61 6e 20 35 31 32 2c 20 6f 72 20  ss than 512, or 
12090 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20  rounded down to 
120a0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
120b0 69 66 20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61  if it.** is grea
120c0 74 65 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43  ter than MAX_SEC
120d0 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61  TOR_SIZE..*/.sta
120e0 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74  tic void setSect
120f0 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  orSize(Pager *pP
12100 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  ager){.  assert(
12110 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
12120 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  fd) || pPager->t
12130 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66  empFile );..  if
12140 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
12150 69 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  ile ){.    /* Se
12160 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27  ctor size doesn'
12170 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d  t matter for tem
12180 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c  porary files. Al
12190 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20  so, the file.   
121a0 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65   ** may not have
121b0 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74   been opened yet
121c0 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  , in which case 
121d0 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65  the OsSectorSize
121e0 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77  ().    ** call w
121f0 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20 20  ill segfault..  
12200 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
12210 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71  >sectorSize = sq
12220 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
12230 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
12240 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
12250 3e 73 65 63 74 6f 72 53 69 7a 65 3c 35 31 32 20  >sectorSize<512 
12260 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
12270 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b  ectorSize = 512;
12280 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
12290 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 4d 41  r->sectorSize>MA
122a0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b  X_SECTOR_SIZE ){
122b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d 41 58  .    assert( MAX
122c0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31  _SECTOR_SIZE>=51
122d0 32 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  2 );.    pPager-
122e0 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 4d 41  >sectorSize = MA
122f0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20  X_SECTOR_SIZE;. 
12300 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79   }.}../*.** Play
12310 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  back the journal
12320 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72   and thus restor
12330 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
12340 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74  ile to.** the st
12350 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65  ate it was in be
12360 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20  fore we started 
12370 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20  making changes. 
12380 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72   .**.** The jour
12390 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  nal file format 
123a0 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a  is as follows: .
123b0 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79  **.**  (1)  8 by
123c0 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f  te prefix.  A co
123d0 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61  py of aJournalMa
123e0 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20  gic[]..**  (2)  
123f0 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
12400 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
12410 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
12420 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
12430 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20  rds.**       in 
12440 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66  the journal.  If
12450 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30   this value is 0
12460 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
12470 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20  compute the.**  
12480 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70       number of p
12490 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  age records from
124a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a   the journal siz
124b0 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79  e..**  (3)  4 by
124c0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
124d0 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
124e0 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
124f0 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20   for the .**    
12500 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73     sanity checks
12510 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62  um..**  (4)  4 b
12520 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
12530 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
12540 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e  of pages to trun
12550 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  cate the.**     
12560 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75    database to du
12570 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
12580 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65  .**  (5)  4 byte
12590 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
125a0 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
125b0 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54   sector size.  T
125c0 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20  he header.**    
125d0 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20     is this many 
125e0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
125f0 2a 20 20 28 36 29 20 20 34 20 62 79 74 65 20 62  *  (6)  4 byte b
12600 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
12610 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70  r which is the p
12620 61 67 65 20 63 61 73 65 2e 0a 2a 2a 20 20 28 37  age case..**  (7
12630 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65  )  4 byte intege
12640 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
12650 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
12660 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
12670 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61  rnal.**       na
12680 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d  me.  The value m
12690 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69  ay be zero (indi
126a0 63 61 74 65 20 74 68 61 74 20 74 68 65 72 65 20  cate that there 
126b0 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20  is no master.** 
126c0 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a        journal.).
126d0 2a 2a 20 20 28 38 29 20 20 4e 20 62 79 74 65 73  **  (8)  N bytes
126e0 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
126f0 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68  ournal name.  Th
12700 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e  e name will be n
12710 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  ul-terminated.**
12720 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74         and might
12730 20 62 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e   be shorter than
12740 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
12750 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68  from (5).  If th
12760 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20  e first byte.** 
12770 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d        of the nam
12780 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74  e is \000 then t
12790 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65  here is no maste
127a0 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20  r journal.  The 
127b0 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  master.**       
127c0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20  journal name is 
127d0 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e  stored in UTF-8.
127e0 0a 2a 2a 20 20 28 39 29 20 20 5a 65 72 6f 20 6f  .**  (9)  Zero o
127f0 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73  r more pages ins
12800 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20  tances, each as 
12810 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20  follows:.**     
12820 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67     +  4 byte pag
12830 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20  e number..**    
12840 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70      +  pPager->p
12850 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
12860 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20   data..**       
12870 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b   +  4 byte check
12880 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77  sum.**.** When w
12890 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a  e speak of the j
128a0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77  ournal header, w
128b0 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74  e mean the first
128c0 20 38 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a   8 items above..
128d0 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e  ** Each entry in
128e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
128f0 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
12900 68 65 20 39 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a  he 9th item..**.
12910 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75  ** Call the valu
12920 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  e from the secon
12930 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e  d bullet "nRec".
12940 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75    nRec is the nu
12950 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64  mber of.** valid
12960 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e   page entries in
12970 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
12980 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f  n most cases, yo
12990 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  u can compute th
129a0 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52  e.** value of nR
129b0 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ec from the size
129c0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
129d0 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20  file.  But if a 
129e0 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
129f0 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
12a00 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
12a10 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69  being written, i
12a20 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a  t could be the.*
12a30 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  * case that the 
12a40 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
12a50 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72  nal file had alr
12a60 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61  eady been increa
12a70 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65  sed but.** the e
12a80 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64  xtra entries had
12a90 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74   not yet made it
12aa0 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e   safely to disk.
12ab0 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65    In such a case
12ac0 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
12ad0 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  f nRec computed 
12ae0 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
12af0 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20  ze would be too 
12b00 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  large.  For.** t
12b10 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61  hat reason, we a
12b20 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52  lways use the nR
12b30 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ec value in the 
12b40 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  header..**.** If
12b50 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
12b60 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74  is 0xffffffff it
12b70 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63   means that nRec
12b80 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
12b90 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ted.** from the 
12ba0 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73  file size.  This
12bb0 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77   value is used w
12bc0 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c  hen the user sel
12bd0 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73  ects the.** no-s
12be0 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74  ync option for t
12bf0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70  he journal.  A p
12c00 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
12c10 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75  ld lead to corru
12c20 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73  ption.** in this
12c30 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20   case.  But for 
12c40 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70  things like temp
12c50 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69  orary table (whi
12c60 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  ch will be.** de
12c70 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70  leted when the p
12c80 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
12c90 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e  ) we don't care.
12ca0 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
12cb0 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74  file opened as t
12cc0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
12cd0 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f  is not a well-fo
12ce0 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  rmed.** journal 
12cf0 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61  file then all pa
12d00 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69  ges up to the fi
12d10 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61  rst corrupted pa
12d20 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a  ge are rolled.**
12d30 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67   back (or no pag
12d40 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  es if the journa
12d50 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72  l header is corr
12d60 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72  upted). The jour
12d70 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74  nal file.** is t
12d80 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20  hen deleted and 
12d90 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
12da0 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e  ed, just as if n
12db0 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64  o corruption had
12dc0 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  .** been encount
12dd0 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ered..**.** If a
12de0 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  n I/O or malloc(
12df0 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
12e00 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  the journal-file
12e10 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a   is not deleted.
12e20 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
12e30 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
12e40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f  ..**.** The isHo
12e50 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69  t parameter indi
12e60 63 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72  cates that we ar
12e70 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c  e trying to roll
12e80 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a  back a journal.*
12e90 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  * that might be 
12ea0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  a hot journal.  
12eb0 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  Or, it could be 
12ec0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
12ed0 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65   is .** preserve
12ee0 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55  d because of JOU
12ef0 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
12f00 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f   or JOURNALMODE_
12f10 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20  TRUNCATE..** If 
12f20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c  the journal real
12f30 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74  ly is hot, reset
12f40 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
12f50 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a   prior rolling.*
12f60 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65  * back any conte
12f70 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72  nt.  If the jour
12f80 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65  nal is merely pe
12f90 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73  rsistent, no res
12fa0 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e  et is.** needed.
12fb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
12fc0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
12fd0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
12fe0 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74   isHot){.  sqlit
12ff0 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
13000 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
13010 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
13020 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
13030 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
13040 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
13050 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20    u32 nRec;     
13060 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
13070 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
13080 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  in the journal *
13090 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
130a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
130b0 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
130c0 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
130d0 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
130e0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
130f0 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
13100 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
13110 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
13120 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
13130 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
13140 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
13150 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  res = 1;        
13160 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
13170 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
13180 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20  3OsAccess() */. 
13190 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
131a0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
131b0 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
131c0 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20  nal file if any 
131d0 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67  */.  int needPag
131e0 65 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  erReset;      /*
131f0 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70   True to reset p
13200 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72  age prior to fir
13210 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b  st page rollback
13220 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
13230 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
13240 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
13250 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74   journal.  Abort
13260 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74   early if.  ** t
13270 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d  he journal is em
13280 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pty..  */.  asse
13290 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
132a0 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20  r->jfd) );.  rc 
132b0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
132c0 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
132d0 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
132e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
132f0 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74  zJ==0 ){.    got
13300 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
13310 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
13320 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
13330 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  l name from the 
13340 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
13350 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20  s present..  ** 
13360 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
13370 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
13380 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20   specified, but 
13390 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a  the file is not.
133a0 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20    ** present on 
133b0 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a  disk, then the j
133c0 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f  ournal is not ho
133d0 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e  t and does not n
133e0 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70  eed to be.  ** p
133f0 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a  layed back..  **
13400 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68  .  ** TODO: Tech
13410 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c  nically the foll
13420 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f  owing is an erro
13430 72 20 62 65 63 61 75 73 65 20 69 74 20 61 73 73  r because it ass
13440 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62  umes that.  ** b
13450 75 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70  uffer Pager.pTmp
13460 53 70 61 63 65 20 69 73 20 28 6d 78 50 61 74 68  Space is (mxPath
13470 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72  name+1) bytes or
13480 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68   larger. i.e. th
13490 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d  at.  ** (pPager-
134a0 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61  >pageSize >= pPa
134b0 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
134c0 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20  hname+1). Using 
134d0 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20  os_unix.c,.  ** 
134e0 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35   mxPathname is 5
134f0 31 32 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  12, which is the
13500 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e   same as the min
13510 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76  imum allowable v
13520 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61  alue.  ** for pa
13530 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a  geSize..  */.  z
13540 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
13550 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63  >pTmpSpace;.  rc
13560 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
13570 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
13580 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
13590 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
135a0 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63  ame+1);.  if( rc
135b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
135c0 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20  Master[0] ){.   
135d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
135e0 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73  ccess(pVfs, zMas
135f0 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ter, SQLITE_ACCE
13600 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29  SS_EXISTS, &res)
13610 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20  ;.  }.  zMaster 
13620 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  = 0;.  if( rc!=S
13630 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73  QLITE_OK || !res
13640 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
13650 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
13660 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13670 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50  Off = 0;.  needP
13680 61 67 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f  agerReset = isHo
13690 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  t;..  /* This lo
136a0 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69  op terminates ei
136b0 74 68 65 72 20 77 68 65 6e 20 61 20 72 65 61 64  ther when a read
136c0 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20  JournalHdr() or 
136d0 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79  .  ** pager_play
136e0 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20  back_one_page() 
136f0 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c  call returns SQL
13700 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49  ITE_DONE or an I
13710 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63  O error .  ** oc
13720 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68  curs. .  */.  wh
13730 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 6e  ile( 1 ){.    in
13740 74 20 69 73 55 6e 73 79 6e 63 20 3d 20 30 3b 0a  t isUnsync = 0;.
13750 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
13760 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
13770 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ader from the jo
13780 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20  urnal file.  If 
13790 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a  there are.    **
137a0 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65   not enough byte
137b0 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f  s left in the jo
137c0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61  urnal file for a
137d0 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72   complete header
137e0 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69  , or.    ** it i
137f0 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65  s corrupted, the
13800 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74  n a process must
13810 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65   of failed while
13820 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20   writing it..   
13830 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74   ** This indicat
13840 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20  es nothing more 
13850 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c  needs to be roll
13860 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a  ed back..    */.
13870 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
13880 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
13890 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
138a0 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
138b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
138c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
138d0 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
138e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
138f0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
13900 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
13910 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
13920 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
13930 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
13940 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
13950 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
13960 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
13970 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
13980 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
13990 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
139a0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
139b0 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
139c0 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
139d0 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
139e0 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
139f0 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
13a00 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
13a10 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
13a20 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
13a30 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
13a40 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
13a50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
13a60 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
13a70 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
13a80 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
13a90 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
13aa0 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
13ab0 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
13ac0 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
13ad0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
13ae0 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64  If nRec is 0 and
13af0 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69   this rollback i
13b00 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  s of a transacti
13b10 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68  on created by th
13b20 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  is.    ** proces
13b30 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73  s and if this is
13b40 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65   the final heade
13b50 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
13b60 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a  , then it means.
13b70 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73      ** that this
13b80 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75   part of the jou
13b90 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66  rnal was being f
13ba0 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f  illed but has no
13bb0 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a  t yet been.    *
13bc0 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  * synced to disk
13bd0 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e  .  Compute the n
13be0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62  umber of pages b
13bf0 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61  ased on the rema
13c00 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a  ining.    ** siz
13c10 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20  e of the file.. 
13c20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
13c30 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74   third term of t
13c40 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65  he test was adde
13c50 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20  d to fix ticket 
13c60 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68  #2565..    ** Wh
13c70 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
13c80 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e  a hot journal, n
13c90 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65  Rec==0 always me
13ca0 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ans that the nex
13cb0 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f  t.    ** chunk o
13cc0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f  f the journal co
13cd0 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65  ntains zero page
13ce0 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
13cf0 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a  ack.  But.    **
13d00 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f   when doing a RO
13d10 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e  LLBACK and the n
13d20 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20  Rec==0 chunk is 
13d30 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69  the last chunk i
13d40 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  n.    ** the jou
13d50 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  rnal, it means t
13d60 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
13d70 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64  might contain ad
13d80 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20  ditional.    ** 
13d90 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20  pages that need 
13da0 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
13db0 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e  k and that the n
13dc0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a  umber of pages .
13dd0 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
13de0 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20   computed based 
13df0 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
13e00 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  ile size..    */
13e10 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
13e20 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74  Rec==0 && !isHot
13e30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61  .         && pPa
13e40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b  ger->journalHdr+
13e50 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
13e60 50 61 67 65 72 29 21 3d 70 50 61 67 65 72 2d 3e  Pager)!=pPager->
13e70 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 20  journalOff.     
13e80 20 20 20 20 26 26 20 28 28 73 7a 4a 20 2d 20 70      && ((szJ - p
13e90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
13ea0 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  f) / JOURNAL_PG_
13eb0 53 5a 28 70 50 61 67 65 72 29 29 3e 30 0a 20 20  SZ(pPager))>0.  
13ec0 20 20 20 20 20 20 20 26 26 20 70 61 67 65 72 4e         && pagerN
13ed0 65 78 74 4a 6f 75 72 6e 61 6c 50 61 67 65 49 73  extJournalPageIs
13ee0 56 61 6c 69 64 28 70 50 61 67 65 72 29 0a 20 20  Valid(pPager).  
13ef0 20 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 52 65    );.    if( nRe
13f00 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26  c==0 && !isHot &
13f10 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  &.        pPager
13f20 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
13f30 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
13f40 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
13f50 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20  rnalOff ){.     
13f60 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73   nRec = (int)((s
13f70 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
13f80 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e  rnalOff) / JOURN
13f90 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
13fa0 29 3b 0a 20 20 20 20 20 20 69 73 55 6e 73 79 6e  );.      isUnsyn
13fb0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  c = 1;.    }..  
13fc0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
13fd0 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
13fe0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
13ff0 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65  ournal, truncate
14000 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
14010 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74  base file back t
14020 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
14030 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
14040 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
14050 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
14060 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
14070 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
14080 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
14090 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20  er, mxPg);.     
140a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
140b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
140c0 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
140d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
140e0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
140f0 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  mxPg;.    }..   
14100 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
14110 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
14120 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  he journal and b
14130 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  ack into the .  
14140 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
14150 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63  le and/or page c
14160 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ache..    */.   
14170 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63   for(u=0; u<nRec
14180 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; u++){.      if
14190 28 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  ( needPagerReset
141a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
141b0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
141c0 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50 61 67  .        needPag
141d0 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20  erReset = 0;.   
141e0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
141f0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
14200 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 31  ne_page(pPager,1
14210 2c 69 73 55 6e 73 79 6e 63 2c 26 70 50 61 67 65  ,isUnsync,&pPage
14220 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c  r->journalOff,0,
14230 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
14240 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14250 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
14260 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
14270 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
14280 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
14290 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
142a0 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
142b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
142c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
142d0 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61        /* If we a
142e0 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c  re unable to rol
142f0 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64 20  lback, quit and 
14300 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
14310 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
14320 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63  de.  This will c
14330 61 75 73 65 20 74 68 65 20 70 61 67 65 72 20 74  ause the pager t
14340 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f  o enter the erro
14350 72 20 73 74 61 74 65 0a 20 20 20 20 20 20 20 20  r state.        
14360 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20    ** so that no 
14370 66 75 72 74 68 65 72 20 68 61 72 6d 20 77 69 6c  further harm wil
14380 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72 68  l be done.  Perh
14390 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20 20  aps the next.   
143a0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
143b0 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20  s to come along 
143c0 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20  will be able to 
143d0 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61 74  rollback the dat
143e0 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20  abase..         
143f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f   */.          go
14400 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
14410 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14420 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
14430 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20  *NOTREACHED*/.  
14440 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e  assert( 0 );..en
14450 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a  d_playback:.  /*
14460 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c   Following a rol
14470 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62  lback, the datab
14480 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  ase file should 
14490 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f  be back in its o
144a0 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61  riginal.  ** sta
144b0 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  te prior to the 
144c0 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
144d0 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76  nsaction, so inv
144e0 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c  oke the.  ** SQL
144f0 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
14500 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74  HANGED file-cont
14510 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69  rol method to di
14520 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61  sable the.  ** a
14530 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68  ssertion that th
14540 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
14550 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69  unter was modifi
14560 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
14570 74 28 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66  t(.    pPager->f
14580 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d 30 20 7c  d->pMethods==0 |
14590 7c 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  |.    sqlite3OsF
145a0 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65  ileControl(pPage
145b0 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e  r->fd,SQLITE_FCN
145c0 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c  TL_DB_UNCHANGED,
145d0 30 29 3e 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  0)>=SQLITE_OK.  
145e0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
145f0 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70   playback is hap
14600 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63  pening automatic
14610 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74  ally as a result
14620 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20   of an IO or .  
14630 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20  ** malloc error 
14640 74 68 61 74 20 6f 63 63 75 72 72 65 64 20 61 66  that occurred af
14650 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ter the change-c
14660 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
14670 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66  ed but .  ** bef
14680 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
14690 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65  ion was committe
146a0 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e  d, then the chan
146b0 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a  ge-counter .  **
146c0 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61   modification ma
146d0 79 20 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e  y just have been
146e0 20 72 65 76 65 72 74 65 64 2e 20 49 66 20 74 68   reverted. If th
146f0 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78  is happens in ex
14700 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f  clusive .  ** mo
14710 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75  de, then subsequ
14720 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ent transactions
14730 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68   performed by th
14740 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c  e connection wil
14750 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74  l not.  ** updat
14760 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
14770 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69  nter at all. Thi
14780 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61  s may lead to ca
14790 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63  che inconsistenc
147a0 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20  y.  ** problems 
147b0 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73  for other proces
147c0 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e  ses at some poin
147d0 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e  t in the future.
147e0 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69   So, just.  ** i
147f0 6e 20 63 61 73 65 20 74 68 69 73 20 68 61 73 20  n case this has 
14800 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20  happened, clear 
14810 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  the changeCountD
14820 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20  one flag now..  
14830 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  */.  pPager->cha
14840 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
14850 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
14860 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
14870 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61  TE_OK ){.    zMa
14880 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
14890 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63  TmpSpace;.    rc
148a0 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
148b0 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
148c0 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
148d0 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
148e0 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74  ame+1);.    test
148f0 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
14900 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  _OK );.  }.  if(
14910 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14920 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
14930 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
14940 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
14950 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a 20 20 20 20  [0]!='\0');.    
14960 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
14970 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
14980 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14990 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d  OK && zMaster[0]
149a0 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f   && res ){.    /
149b0 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
149c0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
149d0 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  and this routine
149e0 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63   will return suc
149f0 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65  cess,.    ** see
14a00 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
14a10 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
14a20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
14a30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
14a40 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
14a50 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
14a60 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
14a70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14a80 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
14a90 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
14aa0 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61   variable may ha
14ab0 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20  ve been updated 
14ac0 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20  while rolling.  
14ad0 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ** back a journa
14ae0 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  l created by a p
14af0 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69  rocess with a di
14b00 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73  fferent sector s
14b10 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  ize.  ** value. 
14b20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20  Reset it to the 
14b30 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f  correct value fo
14b40 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  r this process..
14b50 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72    */.  setSector
14b60 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
14b70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
14b80 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73 61 76  .** Playback sav
14b90 65 70 6f 69 6e 74 20 70 53 61 76 65 70 6f 69 6e  epoint pSavepoin
14ba0 74 2e 20 4f 72 2c 20 69 66 20 70 53 61 76 65 70  t. Or, if pSavep
14bb0 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e  oint==NULL, then
14bc0 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65   playback.** the
14bd0 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
14be0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
14bf0 20 63 61 73 65 20 70 53 61 76 65 70 6f 69 6e 74   case pSavepoint
14c00 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77 68  ==NULL occurs wh
14c10 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43  en .** a ROLLBAC
14c20 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20  K TO command is 
14c30 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56  invoked on a SAV
14c40 45 50 4f 49 4e 54 20 74 68 61 74 20 69 73 20 61  EPOINT that is a
14c50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a   transaction .**
14c60 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a   savepoint..**.*
14c70 2a 20 57 68 65 6e 20 70 53 61 76 65 70 6f 69 6e  * When pSavepoin
14c80 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d  t is not NULL (m
14c90 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61  eaning a non-tra
14ca0 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
14cb0 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20  nt is .** being 
14cc0 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74 68  rolled back), th
14cd0 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
14ce0 63 6f 6e 73 69 73 74 73 20 6f 66 20 75 70 20 74  consists of up t
14cf0 6f 20 74 68 72 65 65 20 73 74 61 67 65 73 2c 0a  o three stages,.
14d00 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 69 6e 20  ** performed in 
14d10 74 68 65 20 6f 72 64 65 72 20 73 70 65 63 69 66  the order specif
14d20 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50  ied:.**.**   * P
14d30 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 20  ages are played 
14d40 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
14d50 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
14d60 69 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a 20 20  ing at byte.**  
14d70 20 20 20 6f 66 66 73 65 74 20 50 61 67 65 72 53     offset PagerS
14d80 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74  avepoint.iOffset
14d90 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
14da0 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72  to .**     Pager
14db0 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
14dc0 66 73 65 74 2c 20 6f 72 20 74 6f 20 74 68 65 20  fset, or to the 
14dd0 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  end of the main 
14de0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66  journal.**     f
14df0 69 6c 65 20 69 66 20 50 61 67 65 72 53 61 76 65  ile if PagerSave
14e00 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
14e10 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20   is zero..**.** 
14e20 20 20 2a 20 49 66 20 50 61 67 65 72 53 61 76 65    * If PagerSave
14e30 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
14e40 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
14e50 65 6e 20 70 61 67 65 73 20 61 72 65 20 70 6c 61  en pages are pla
14e60 79 65 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20  yed.**     back 
14e70 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 74 68  starting from th
14e80 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
14e90 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
14ea0 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50  lowing .**     P
14eb0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
14ec0 64 72 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  drOffset to the 
14ed0 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  end of the main 
14ee0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
14ef0 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72  .**   * Pages ar
14f00 65 20 74 68 65 6e 20 70 6c 61 79 65 64 20 62 61  e then played ba
14f10 63 6b 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ck from the sub-
14f20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74  journal file, st
14f30 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69  arting.**     wi
14f40 74 68 20 74 68 65 20 50 61 67 65 72 53 61 76 65  th the PagerSave
14f50 70 6f 69 6e 74 2e 69 53 75 62 52 65 63 20 61 6e  point.iSubRec an
14f60 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
14f70 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20  the end of.**   
14f80 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    the journal fi
14f90 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67  le..**.** Throug
14fa0 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63  hout the rollbac
14fb0 6b 20 70 72 6f 63 65 73 73 2c 20 65 61 63 68 20  k process, each 
14fc0 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 72  time a page is r
14fd0 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 0a  olled back, the.
14fe0 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
14ff0 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 61   bit is set in a
15000 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72   bitvec structur
15010 65 20 28 76 61 72 69 61 62 6c 65 20 70 44 6f 6e  e (variable pDon
15020 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c  e in the.** impl
15030 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77  ementation below
15040 29 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  ). This is used 
15050 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 61  to ensure that a
15060 20 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a   page is only.**
15070 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
15080 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 20 69   first time it i
15090 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e  s encountered in
150a0 20 65 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e   either journal.
150b0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65 70  .**.** If pSavep
150c0 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  oint is NULL, th
150d0 65 6e 20 70 61 67 65 73 20 61 72 65 20 6f 6e 6c  en pages are onl
150e0 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  y played back fr
150f0 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a  om the main.** j
15100 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
15110 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f  re is no need fo
15120 72 20 61 20 62 69 74 76 65 63 20 69 6e 20 74 68  r a bitvec in th
15130 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
15140 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 62  n either case, b
15150 65 66 6f 72 65 20 70 6c 61 79 62 61 63 6b 20 63  efore playback c
15160 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20 50 61 67  ommences the Pag
15170 65 72 2e 64 62 53 69 7a 65 20 76 61 72 69 61 62  er.dbSize variab
15180 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65 74 20 74  le.** is reset t
15190 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68 61 74  o the value that
151a0 20 69 74 20 68 65 6c 64 20 61 74 20 74 68 65 20   it held at the 
151b0 73 74 61 72 74 20 6f 66 20 74 68 65 20 73 61 76  start of the sav
151c0 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74  epoint .** (or t
151d0 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20  ransaction). No 
151e0 70 61 67 65 20 77 69 74 68 20 61 20 70 61 67 65  page with a page
151f0 2d 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20  -number greater 
15200 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 0a  than this value.
15210 2a 2a 20 69 73 20 70 6c 61 79 65 64 20 62 61 63  ** is played bac
15220 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20 65 6e 63  k. If one is enc
15230 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20 73  ountered it is s
15240 69 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a  imply skipped..*
15250 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
15260 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
15270 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
15280 72 2c 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  r, PagerSavepoin
15290 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a  t *pSavepoint){.
152a0 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
152b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 66             /* Ef
152c0 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20  fective size of 
152d0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
152e0 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
152f0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
15300 2a 20 45 6e 64 20 6f 66 20 66 69 72 73 74 20 73  * End of first s
15310 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a  egment of main-j
15320 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a  ournal records *
15330 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
15340 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20  ITE_OK;      /* 
15350 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
15360 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d   Bitvec *pDone =
15370 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74   0;       /* Bit
15380 76 65 63 20 74 6f 20 65 6e 73 75 72 65 20 70 61  vec to ensure pa
15390 67 65 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ges played back 
153a0 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20  only once */..  
153b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
153c0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
153d0 52 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  RED );..  /* All
153e0 6f 63 61 74 65 20 61 20 62 69 74 76 65 63 20 74  ocate a bitvec t
153f0 6f 20 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74  o use to store t
15400 68 65 20 73 65 74 20 6f 66 20 70 61 67 65 73 20  he set of pages 
15410 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20  rolled back */. 
15420 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20   if( pSavepoint 
15430 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73  ){.    pDone = s
15440 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
15450 74 65 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e  te(pSavepoint->n
15460 4f 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21  Orig);.    if( !
15470 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72  pDone ){.      r
15480 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
15490 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  EM;.    }.  }.. 
154a0 20 2f 2a 20 53 65 74 20 74 68 65 20 64 61 74 61   /* Set the data
154b0 62 61 73 65 20 73 69 7a 65 20 62 61 63 6b 20 74  base size back t
154c0 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 77  o the value it w
154d0 61 73 20 62 65 66 6f 72 65 20 74 68 65 20 73 61  as before the sa
154e0 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65  vepoint .  ** be
154f0 69 6e 67 20 72 65 76 65 72 74 65 64 20 77 61 73  ing reverted was
15500 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20   opened..  */.  
15510 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
15520 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20 70 53   pSavepoint ? pS
15530 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20  avepoint->nOrig 
15540 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  : pPager->dbOrig
15550 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 55 73 65 20  Size;..  /* Use 
15560 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15570 66 66 20 61 73 20 74 68 65 20 65 66 66 65 63 74  ff as the effect
15580 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
15590 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  main rollback.  
155a0 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  ** journal.  The
155b0 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67   actual file mig
155c0 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ht be larger tha
155d0 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50  n this in.  ** P
155e0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
155f0 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47  _TRUNCATE or PAG
15600 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
15610 45 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79  ERSIST.  But any
15620 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20  thing.  ** past 
15630 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15640 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73  ff is off-limits
15650 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73   to us..  */.  s
15660 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ = pPager->jou
15670 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 42  rnalOff;..  /* B
15680 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20  egin by rolling 
15690 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f  back records fro
156a0 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
156b0 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20  al starting at. 
156c0 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
156d0 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63  nt.iOffset and c
156e0 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
156f0 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
15700 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65  ader..  ** There
15710 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64   might be record
15720 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  s in the main jo
15730 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20  urnal that have 
15740 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  a page number.  
15750 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
15760 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
15770 62 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65  base size (pPage
15780 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74  r->dbSize) but t
15790 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  hose.  ** will b
157a0 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61  e skipped automa
157b0 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20  tically.  Pages 
157c0 61 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f  are added to pDo
157d0 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20  ne as they.  ** 
157e0 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e  are played back.
157f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  .  */.  if( pSav
15800 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 69 48  epoint ){.    iH
15810 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69  drOff = pSavepoi
15820 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3f  nt->iHdrOffset ?
15830 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64   pSavepoint->iHd
15840 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20  rOffset : szJ;. 
15850 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
15860 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69  alOff = pSavepoi
15870 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20  nt->iOffset;.   
15880 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
15890 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
158a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72  >journalOff<iHdr
158b0 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Off ){.      rc 
158c0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
158d0 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
158e0 2c 20 31 2c 20 30 2c 20 26 70 50 61 67 65 72 2d  , 1, 0, &pPager-
158f0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 2c 20  >journalOff, 1, 
15900 70 44 6f 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pDone);.    }.  
15910 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
15920 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
15930 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
15940 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
15950 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74  ;.  }..  /* Cont
15960 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63  inue rolling bac
15970 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66  k records out of
15980 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
15990 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
159a0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  ** the first jou
159b0 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e  rnal header seen
159c0 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
159d0 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63 74  until the effect
159e0 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20  ive end.  ** of 
159f0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
15a00 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65   file.  Continue
15a10 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d   to skip out-of-
15a20 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a  range pages and.
15a30 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64    ** continue ad
15a40 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65  ding pages rolle
15a50 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e  d back to pDone.
15a60 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72  .  */.  while( r
15a70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
15a80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15a90 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33  ff<szJ ){.    u3
15aa0 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  2 ii;           
15ab0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
15ac0 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65   */.    u32 nJRe
15ad0 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75  c = 0;     /* Nu
15ae0 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20  mber of Journal 
15af0 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75  Records */.    u
15b00 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63  32 dummy;.    rc
15b10 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
15b20 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26  r(pPager, szJ, &
15b30 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a  nJRec, &dummy);.
15b40 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
15b50 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a  SQLITE_DONE );..
15b60 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68      /*.    ** Th
15b70 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  e "pPager->journ
15b80 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
15b90 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
15ba0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15bb0 22 0a 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73  ".    ** test is
15bc0 20 72 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b   related to tick
15bd0 65 74 20 23 32 35 36 35 2e 20 20 53 65 65 20 74  et #2565.  See t
15be0 68 65 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e  he discussion in
15bf0 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
15c00 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e  r_playback() fun
15c10 63 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69  ction for additi
15c20 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
15c30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
15c40 65 72 74 28 20 21 28 6e 4a 52 65 63 3d 3d 30 0a  ert( !(nJRec==0.
15c50 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61 67           && pPag
15c60 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
15c70 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
15c80 61 67 65 72 29 21 3d 70 50 61 67 65 72 2d 3e 6a  ager)!=pPager->j
15c90 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 20 20  ournalOff.      
15ca0 20 20 20 26 26 20 28 28 73 7a 4a 20 2d 20 70 50     && ((szJ - pP
15cb0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15cc0 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) / JOURNAL_PG_S
15cd0 5a 28 70 50 61 67 65 72 29 29 3e 30 0a 20 20 20  Z(pPager))>0.   
15ce0 20 20 20 20 20 20 26 26 20 70 61 67 65 72 4e 65        && pagerNe
15cf0 78 74 4a 6f 75 72 6e 61 6c 50 61 67 65 49 73 56  xtJournalPageIsV
15d00 61 6c 69 64 28 70 50 61 67 65 72 29 29 0a 20 20  alid(pPager)).  
15d10 20 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4a 52    );.    if( nJR
15d20 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70  ec==0 .     && p
15d30 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
15d40 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
15d50 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
15d60 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20  ->journalOff.   
15d70 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20   ){.      nJRec 
15d80 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20 70  = (u32)((szJ - p
15d90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
15da0 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  f)/JOURNAL_PG_SZ
15db0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
15dc0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72  .    for(ii=0; r
15dd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
15de0 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67  ii<nJRec && pPag
15df0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73  er->journalOff<s
15e00 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  zJ; ii++){.     
15e10 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
15e20 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
15e30 61 67 65 72 2c 20 31 2c 20 30 2c 20 26 70 50 61  ager, 1, 0, &pPa
15e40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
15e50 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20 20   1, pDone);.    
15e60 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
15e70 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
15e80 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72  .  }.  assert( r
15e90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
15ea0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15eb0 66 66 3d 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a  ff==szJ );..  /*
15ec0 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62   Finally,  rollb
15ed0 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74  ack pages from t
15ee0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
15ef0 20 50 61 67 65 20 74 68 61 74 20 77 65 72 65 0a   Page that were.
15f00 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20    ** previously 
15f10 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20  rolled back out 
15f20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
15f30 6e 61 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e  nal (and are hen
15f40 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a  ce in pDone).  *
15f50 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65  * will be skippe
15f60 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65  d.  Out-of-range
15f70 20 70 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20   pages are also 
15f80 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
15f90 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29  if( pSavepoint )
15fa0 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20  {.    u32 ii;   
15fb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
15fc0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
15fd0 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70 53 61  i64 offset = pSa
15fe0 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63  vepoint->iSubRec
15ff0 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
16000 53 69 7a 65 29 3b 0a 20 20 20 20 66 6f 72 28 69  Size);.    for(i
16010 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53  i=pSavepoint->iS
16020 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54  ubRec; rc==SQLIT
16030 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65  E_OK && ii<pPage
16040 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b  r->nSubRec; ii++
16050 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
16060 20 6f 66 66 73 65 74 3d 3d 69 69 2a 28 34 2b 70   offset==ii*(4+p
16070 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
16080 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
16090 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
160a0 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 30  e_page(pPager, 0
160b0 2c 20 30 2c 20 26 6f 66 66 73 65 74 2c 20 31 2c  , 0, &offset, 1,
160c0 20 70 44 6f 6e 65 29 3b 0a 20 20 20 20 7d 0a 20   pDone);.    }. 
160d0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
160e0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
160f0 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  }..  sqlite3Bitv
16100 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65 29  ecDestroy(pDone)
16110 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
16120 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
16130 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
16140 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 72 65 74  = szJ;.  }.  ret
16150 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
16160 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   Change the maxi
16170 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  mum number of in
16180 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68  -memory pages th
16190 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a  at are allowed..
161a0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
161b0 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
161c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
161d0 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73  int mxPage){.  s
161e0 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 43  qlite3PcacheSetC
161f0 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d  achesize(pPager-
16200 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65  >pPCache, mxPage
16210 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75  );.}../*.** Adju
16220 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73  st the robustnes
16230 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
16240 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20  e to damage due 
16250 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a  to OS crashes.**
16260 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72   or power failur
16270 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74  es by changing t
16280 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e  he number of syn
16290 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69  cs()s when writi
162a0 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  ng.** the rollba
162b0 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  ck journal.  The
162c0 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76  re are three lev
162d0 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46  els:.**.**    OF
162e0 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  F       sqlite3O
162f0 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72  sSync() is never
16300 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69   called.  This i
16310 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a  s the default.**
16320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
16330 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20  r temporary and 
16340 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e  transient files.
16350 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c  .**.**    NORMAL
16360 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
16370 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62  is synced once b
16380 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
16390 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
163a0 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
163b0 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  se.  This is nor
163c0 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70  mally adequate p
163d0 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a  rotection, but.*
163e0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
163f0 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c  t is theoretical
16400 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f  ly possible, tho
16410 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c  ugh very unlikel
16420 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  y,.**           
16430 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65     that an inope
16440 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c  rtune power fail
16450 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20  ure could leave 
16460 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  the journal.**  
16470 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61              in a
16480 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75   state which wou
16490 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20  ld cause damage 
164a0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
164b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
164c0 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65  when it is rolle
164d0 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
164e0 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a   FULL      The j
164f0 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
16500 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72   twice before wr
16510 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
16520 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
16530 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68    database (with
16540 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   some additional
16550 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74   information - t
16560 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a  he nRec field.**
16570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
16580 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
16590 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74  der - being writ
165a0 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74  ten in between t
165b0 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20  he two.**       
165c0 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20         syncs).  
165d0 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61  If we assume tha
165e0 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20  t writing a.**  
165f0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67              sing
16600 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69  le disk sector i
16610 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74  s atomic, then t
16620 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65  his mode provide
16630 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
16640 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74    assurance that
16650 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c   the journal wil
16660 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  l not be corrupt
16670 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  ed to the.**    
16680 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20            point 
16690 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67  of causing damag
166a0 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
166b0 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
166c0 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63  k..**.** Numeric
166d0 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74   values associat
166e0 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74  ed with these st
166f0 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c  ates are OFF==1,
16700 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e   NORMAL=2,.** an
16710 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66  d FULL=3..*/.#if
16720 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16730 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76  _PAGER_PRAGMAS.v
16740 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
16750 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 50  SetSafetyLevel(P
16760 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
16770 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 62 46 75  t level, int bFu
16780 6c 6c 46 73 79 6e 63 29 7b 0a 20 20 70 50 61 67  llFsync){.  pPag
16790 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c  er->noSync =  (l
167a0 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65  evel==1 || pPage
167b0 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a  r->tempFile) ?1:
167c0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  0;.  pPager->ful
167d0 6c 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d  lSync = (level==
167e0 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  3 && !pPager->te
167f0 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20  mpFile) ?1:0;.  
16800 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
16810 67 73 20 3d 20 28 62 46 75 6c 6c 46 73 79 6e 63  gs = (bFullFsync
16820 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  ?SQLITE_SYNC_FUL
16830 4c 3a 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  L:SQLITE_SYNC_NO
16840 52 4d 41 4c 29 3b 0a 20 20 69 66 28 20 70 50 61  RMAL);.  if( pPa
16850 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50  ger->noSync ) pP
16860 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
16870 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
16880 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
16890 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
168a0 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  e is incremented
168b0 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69   whenever the li
168c0 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74  brary.** attempt
168d0 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  s to open a temp
168e0 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69  orary file.  Thi
168f0 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
16900 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   used for.** tes
16910 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
16920 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66  s only.  .*/.#if
16930 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
16940 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
16950 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  temp_count = 0;.
16960 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70  #endif../*.** Op
16970 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
16980 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  ile..**.** Write
16990 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
169a0 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65  ptor into *pFile
169b0 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
169c0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a  OK on success .*
169d0 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
169e0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
169f0 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69   fail. The OS wi
16a00 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
16a10 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20   .** delete the 
16a20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77  temporary file w
16a30 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
16a40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
16a50 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
16a60 56 46 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28  VFS layer xOpen(
16a70 29 20 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65  ) call are those
16a80 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79   specified.** by
16a90 20 70 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c   parameter vfsFl
16aa0 61 67 73 20 4f 52 65 64 20 77 69 74 68 20 74 68  ags ORed with th
16ab0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
16ac0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
16ad0 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20  EN_READWRITE.** 
16ae0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
16af0 43 52 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51  CREATE.**     SQ
16b00 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
16b10 49 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  IVE.**     SQLIT
16b20 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
16b30 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LOSE.*/.static i
16b40 6e 74 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70  nt pagerOpentemp
16b50 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
16b60 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  r,        /* The
16b70 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   pager object */
16b80 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
16b90 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74  *pFile,  /* Writ
16ba0 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
16bb0 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20  iptor here */.  
16bc0 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20  int vfsFlags    
16bd0 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
16be0 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
16bf0 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20   the VFS */.){. 
16c00 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
16c10 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
16c20 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66   code */..#ifdef
16c30 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
16c40 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
16c50 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65  count++;  /* Use
16c60 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
16c70 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20  d analysis only 
16c80 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73  */.#endif..  vfs
16c90 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45  Flags |=  SQLITE
16ca0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
16cb0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
16cc0 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20  EATE |.         
16cd0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
16ce0 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54  XCLUSIVE | SQLIT
16cf0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
16d00 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c  LOSE;.  rc = sql
16d10 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65  ite3OsOpen(pPage
16d20 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c  r->pVfs, 0, pFil
16d30 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b  e, vfsFlags, 0);
16d40 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
16d50 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
16d60 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72  en(pFile) );.  r
16d70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
16d80 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20  ** Set the busy 
16d90 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
16da0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
16db0 72 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75  r invokes the bu
16dc0 73 79 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71  sy-handler if sq
16dd0 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65  lite3OsLock() re
16de0 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
16df0 5f 42 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e  _BUSY when tryin
16e00 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f  g to upgrade fro
16e10 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53  m no-lock to a S
16e20 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f  HARED lock,.** o
16e30 72 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f  r when trying to
16e40 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20   upgrade from a 
16e50 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f  RESERVED lock to
16e60 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a   an EXCLUSIVE .*
16e70 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20  * lock. It does 
16e80 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65  *not* invoke the
16e90 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68   busy handler wh
16ea0 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f  en upgrading fro
16eb0 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52  m.** SHARED to R
16ec0 45 53 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e  ESERVED, or when
16ed0 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20   upgrading from 
16ee0 53 48 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53  SHARED to EXCLUS
16ef0 49 56 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63  IVE.** (which oc
16f00 63 75 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d  curs during hot-
16f10 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
16f20 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a  ). Summary:.**.*
16f30 2a 20 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20  *   Transition  
16f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f50 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20        | Invokes 
16f60 78 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20  xBusyHandler.** 
16f70 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
16f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
16fb0 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e  NO_LOCK       ->
16fc0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20   SHARED_LOCK    
16fd0 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41    | Yes.**   SHA
16fe0 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45  RED_LOCK   -> RE
16ff0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c  SERVED_LOCK    |
17000 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f   No.**   SHARED_
17010 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53  LOCK   -> EXCLUS
17020 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a  IVE_LOCK   | No.
17030 2a 2a 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f  **   RESERVED_LO
17040 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f  CK -> EXCLUSIVE_
17050 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a  LOCK   | Yes.**.
17060 2a 2a 20 49 66 20 74 68 65 20 62 75 73 79 2d 68  ** If the busy-h
17070 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
17080 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
17090 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a  , the lock is .*
170a0 2a 20 72 65 74 72 69 65 64 2e 20 49 66 20 69 74  * retried. If it
170b0 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74   returns zero, t
170c0 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42  hen the SQLITE_B
170d0 55 53 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20  USY error is.** 
170e0 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
170f0 63 61 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61  caller of the pa
17100 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  ger API function
17110 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
17120 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
17130 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70  dler(.  Pager *p
17140 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
17150 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17160 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
17170 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e    int (*xBusyHan
17180 64 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20  dler)(void *),  
17190 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
171a0 72 20 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65  r to busy-handle
171b0 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  r function */.  
171c0 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
171d0 65 72 41 72 67 20 20 20 20 20 20 20 20 20 20 20  erArg           
171e0 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
171f0 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73   to pass to xBus
17200 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 20 20  yHandler */.){  
17210 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  .  pPager->xBusy
17220 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48  Handler = xBusyH
17230 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72  andler;.  pPager
17240 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
17250 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72  g = pBusyHandler
17260 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  Arg;.}../*.** Se
17270 74 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69  t the reinitiali
17280 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67  zer for this pag
17290 65 72 2e 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c  er. If not NULL,
172a0 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
172b0 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  er.** is called 
172c0 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  when the content
172d0 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63 61   of a page in ca
172e0 63 68 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20  che is modified 
172f0 28 72 65 73 74 6f 72 65 64 29 0a 2a 2a 20 61 73  (restored).** as
17300 20 70 61 72 74 20 6f 66 20 61 20 74 72 61 6e 73   part of a trans
17310 61 63 74 69 6f 6e 20 6f 72 20 73 61 76 65 70 6f  action or savepo
17320 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 20 54 68  int rollback. Th
17330 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65 73  e callback gives
17340 20 0a 2a 2a 20 68 69 67 68 65 72 2d 6c 65 76 65   .** higher-leve
17350 6c 20 63 6f 64 65 20 61 6e 20 6f 70 70 6f 72 74  l code an opport
17360 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65  unity to restore
17370 20 74 68 65 20 45 58 54 52 41 20 73 65 63 74 69   the EXTRA secti
17380 6f 6e 20 74 6f 20 0a 2a 2a 20 61 67 72 65 65 20  on to .** agree 
17390 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65  with the restore
173a0 64 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  d page data..*/.
173b0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
173c0 72 53 65 74 52 65 69 6e 69 74 65 72 28 50 61 67  rSetReiniter(Pag
173d0 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
173e0 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61   (*xReinit)(DbPa
173f0 67 65 2a 29 29 7b 0a 20 20 70 50 61 67 65 72 2d  ge*)){.  pPager-
17400 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65  >xReiniter = xRe
17410 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  init;.}../*.** R
17420 65 70 6f 72 74 20 74 68 65 20 63 75 72 72 65 6e  eport the curren
17430 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20  t page size and 
17440 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
17450 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a  ed bytes back.**
17460 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a   to the codec..*
17470 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
17480 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74 69 63  HAS_CODEC.static
17490 20 76 6f 69 64 20 70 61 67 65 72 52 65 70 6f 72   void pagerRepor
174a0 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  tSize(Pager *pPa
174b0 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
174c0 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68  er->xCodecSizeCh
174d0 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  ng ){.    pPager
174e0 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67  ->xCodecSizeChng
174f0 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c  (pPager->pCodec,
17500 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
17510 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
17520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
17530 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65 73 65  nt)pPager->nRese
17540 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  rve);.  }.}.#els
17550 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  e.# define pager
17560 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20 20 20  ReportSize(X)   
17570 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65    /* No-op if we
17580 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
17590 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69  a codec */.#endi
175a0 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  f../*.** Change 
175b0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 75 73  the page size us
175c0 65 64 20 62 79 20 74 68 65 20 50 61 67 65 72 20  ed by the Pager 
175d0 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77 20  object. The new 
175e0 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73  page size .** is
175f0 20 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61 67   passed in *pPag
17600 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eSize..**.** If 
17610 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
17620 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
17630 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
17640 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
17650 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  .** is a no-op. 
17660 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
17670 65 64 20 69 73 20 74 68 65 20 65 72 72 6f 72 20  ed is the error 
17680 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  state error code
17690 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f   (i.e. .** one o
176a0 66 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  f SQLITE_IOERR, 
176b0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 6f  SQLITE_CORRUPT o
176c0 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a  r SQLITE_FULL)..
176d0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
176e0 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
176f0 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
17700 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65  e:.**.**   * the
17710 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 28   new page size (
17720 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65 53  value of *pPageS
17730 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28 61  ize) is valid (a
17740 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f   power .**     o
17750 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35 31  f two between 51
17760 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58  2 and SQLITE_MAX
17770 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c  _PAGE_SIZE, incl
17780 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a  usive), and.**.*
17790 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72 65 20  *   * there are 
177a0 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  no outstanding p
177b0 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c 20  age references, 
177c0 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  and.**.**   * th
177d0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65 69  e database is ei
177e0 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d  ther not an in-m
177f0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 6f  emory database o
17800 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 61  r it is.**     a
17810 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
17820 62 61 73 65 20 74 68 61 74 20 63 75 72 72 65 6e  base that curren
17830 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  tly consists of 
17840 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a  zero pages..**.*
17850 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72  * then the pager
17860 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69 7a   object page siz
17870 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50 61  e is set to *pPa
17880 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  geSize..**.** If
17890 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
178a0 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e 20  s changed, then 
178b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 73  this function us
178c0 65 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  es sqlite3PagerM
178d0 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f  alloc() .** to o
178e0 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67 65  btain a new Page
178f0 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66  r.pTmpSpace buff
17900 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c 6f  er. If this allo
17910 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a  cation attempt .
17920 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45  ** fails, SQLITE
17930 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
17940 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  ed and the page 
17950 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e 63  size remains unc
17960 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61  hanged. .** In a
17970 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20  ll other cases, 
17980 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
17990 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
179a0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
179b0 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65 69   not changed, ei
179c0 74 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e 65  ther because one
179d0 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61 74   of the enumerat
179e0 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73  ed.** conditions
179f0 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74 72   above is not tr
17a00 75 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 61  ue, the pager wa
17a10 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65  s in error state
17a20 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75   when this.** fu
17a30 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
17a40 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74 68  d, or because th
17a50 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
17a60 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69 6c  ion attempt fail
17a70 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50  ed, .** then *pP
17a80 61 67 65 53 69 7a 65 20 69 73 20 73 65 74 20 74  ageSize is set t
17a90 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61 69  o the old, retai
17aa0 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20 62 65  ned page size be
17ab0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
17ac0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
17ad0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 50  gerSetPagesize(P
17ae0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75 31  ager *pPager, u1
17af0 36 20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69 6e  6 *pPageSize, in
17b00 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69  t nReserve){.  i
17b10 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e  nt rc = pPager->
17b20 65 72 72 43 6f 64 65 3b 0a 20 20 69 66 28 20 72  errCode;.  if( r
17b30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17b40 20 20 20 20 75 31 36 20 70 61 67 65 53 69 7a 65      u16 pageSize
17b50 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20   = *pPageSize;. 
17b60 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53     assert( pageS
17b70 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53  ize==0 || (pageS
17b80 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65  ize>=512 && page
17b90 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  Size<=SQLITE_MAX
17ba0 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20  _PAGE_SIZE) );. 
17bb0 20 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 20     if( pageSize 
17bc0 26 26 20 70 61 67 65 53 69 7a 65 21 3d 70 50 61  && pageSize!=pPa
17bd0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20  ger->pageSize . 
17be0 20 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e      && (pPager->
17bf0 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67  memDb==0 || pPag
17c00 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20  er->dbSize==0). 
17c10 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63      && sqlite3Pc
17c20 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
17c30 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
17c40 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63   .    ){.      c
17c50 68 61 72 20 2a 70 4e 65 77 20 3d 20 28 63 68 61  har *pNew = (cha
17c60 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d  r *)sqlite3PageM
17c70 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b  alloc(pageSize);
17c80 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77  .      if( !pNew
17c90 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
17ca0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
17cb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17cc0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
17cd0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
17ce0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
17cf0 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
17d00 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
17d10 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54  eFree(pPager->pT
17d20 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20  mpSpace);.      
17d30 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70    pPager->pTmpSp
17d40 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ace = pNew;.    
17d50 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
17d60 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 50 61  eSetPageSize(pPa
17d70 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
17d80 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
17d90 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 50 61 67  .    }.    *pPag
17da0 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70 50 61  eSize = (u16)pPa
17db0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
17dc0 20 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c     if( nReserve<
17dd0 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70  0 ) nReserve = p
17de0 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b  Pager->nReserve;
17df0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65  .    assert( nRe
17e00 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73  serve>=0 && nRes
17e10 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20  erve<1000 );.   
17e20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
17e30 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76  e = (i16)nReserv
17e40 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f  e;.    pagerRepo
17e50 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  rtSize(pPager);.
17e60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
17e70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
17e80 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
17e90 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67  e "temporary pag
17ea0 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20 69  e" buffer held i
17eb0 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20  nternally.** by 
17ec0 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73  the pager.  This
17ed0 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68 61   is a buffer tha
17ee0 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20  t is big enough 
17ef0 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65  to hold the.** e
17f00 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
17f10 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
17f20 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20 69  .  This buffer i
17f30 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  s used internall
17f40 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c  y.** during roll
17f50 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65  back and will be
17f60 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65   overwritten whe
17f70 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b  never a rollback
17f80 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74  .** occurs.  But
17f90 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61   other modules a
17fa0 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20 69  re free to use i
17fb0 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61  t too, as long a
17fc0 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b  s.** no rollback
17fd0 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e  s are happening.
17fe0 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
17ff0 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
18000 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
18010 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
18020 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f  >pTmpSpace;.}../
18030 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
18040 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  set the maximum 
18050 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
18060 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73  unt if mxPage is
18070 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d   positive. .** M
18080 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69  ake no changes i
18090 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f  f mxPage is zero
180a0 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41   or negative.  A
180b0 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20  nd never reduce 
180c0 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70  the.** maximum p
180d0 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20  age count below 
180e0 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
180f0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
18100 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ..**.** Regardle
18110 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ss of mxPage, re
18120 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
18130 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
18140 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
18150 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
18160 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
18170 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
18180 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20  .  if( mxPage>0 
18190 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
181a0 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a  xPgno = mxPage;.
181b0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67    }.  sqlite3Pag
181c0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
181d0 65 72 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  er, 0);.  return
181e0 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b   pPager->mxPgno;
181f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
18200 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72  llowing set of r
18210 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
18220 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20   to disable the 
18230 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f  simulated.** I/O
18240 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d   error mechanism
18250 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  .  These routine
18260 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76  s are used to av
18270 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  oid simulated.**
18280 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65   errors in place
18290 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f  s where we do no
182a0 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72  t care about err
182b0 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73  ors..**.** Unles
182c0 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d  s -DSQLITE_TEST=
182d0 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65  1 is used, these
182e0 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c   routines are al
182f0 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20  l no-ops.** and 
18300 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65  generate no code
18310 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
18320 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69  TE_TEST.extern i
18330 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
18340 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74  ror_pending;.ext
18350 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
18360 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74  io_error_hit;.st
18370 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63  atic int saved_c
18380 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65  nt;.void disable
18390 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
183a0 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61  rors(void){.  sa
183b0 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65  ved_cnt = sqlite
183c0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
183d0 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  ng;.  sqlite3_io
183e0 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
183f0 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62   -1;.}.void enab
18400 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
18410 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
18420 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
18430 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64  _pending = saved
18440 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  _cnt;.}.#else.# 
18450 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73  define disable_s
18460 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
18470 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e  rs().# define en
18480 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
18490 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69  o_errors().#endi
184a0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  f../*.** Read th
184b0 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20  e first N bytes 
184c0 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69  from the beginni
184d0 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ng of the file i
184e0 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68  nto memory.** th
184f0 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20  at pDest points 
18500 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  to. .**.** If th
18510 65 20 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e  e pager was open
18520 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e  ed on a transien
18530 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d  t file (zFilenam
18540 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70  e==""), or.** op
18550 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c  ened on a file l
18560 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73  ess than N bytes
18570 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75   in size, the ou
18580 74 70 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a  tput buffer is.*
18590 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c  * zeroed and SQL
185a0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
185b0 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66   The rationale f
185c0 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20  or this is that 
185d0 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
185e0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61  n is used to rea
185f0 64 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  d database heade
18600 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72  rs, and a new tr
18610 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65  ansient or.** ze
18620 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62 61 73  ro sized databas
18630 65 20 68 61 73 20 61 20 68 65 61 64 65 72 20 74  e has a header t
18640 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74  han consists ent
18650 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e  irely of zeroes.
18660 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f  .**.** If any IO
18670 20 65 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f   error apart fro
18680 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  m SQLITE_IOERR_S
18690 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63  HORT_READ is enc
186a0 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65  ountered,.** the
186b0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
186c0 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
186d0 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f  aller and the co
186e0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a  ntents of the.**
186f0 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 75   output buffer u
18700 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  ndefined..*/.int
18710 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61   sqlite3PagerRea
18720 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65  dFileheader(Page
18730 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e  r *pPager, int N
18740 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
18750 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72  *pDest){.  int r
18760 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
18770 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30   memset(pDest, 0
18780 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , N);.  assert( 
18790 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
187a0 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
187b0 6d 70 46 69 6c 65 20 29 3b 0a 20 20 69 66 28 20  mpFile );.  if( 
187c0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
187d0 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  d) ){.    IOTRAC
187e0 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25  E(("DBHDR %p 0 %
187f0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29  d\n", pPager, N)
18800 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
18810 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
18820 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30  >fd, pDest, N, 0
18830 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
18840 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
18850 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
18860 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
18870 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
18880 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18890 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
188a0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
188b0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
188c0 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64   file associated
188d0 20 0a 2a 2a 20 77 69 74 68 20 70 50 61 67 65 72   .** with pPager
188e0 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73  . Normally, this
188f0 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20 61   is calculated a
18900 73 20 28 3c 64 62 20 66 69 6c 65 20 73 69 7a 65  s (<db file size
18910 3e 2f 3c 70 61 67 65 2d 73 69 7a 65 3e 29 2e 0a  >/<page-size>)..
18920 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  ** However, if t
18930 68 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65  he file is betwe
18940 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73  en 1 and <page-s
18950 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69  ize> bytes in si
18960 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69  ze, then .** thi
18970 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  s is considered 
18980 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a  a 1 page file..*
18990 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
189a0 72 20 69 73 20 69 6e 20 65 72 72 6f 72 20 73 74  r is in error st
189b0 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
189c0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
189d0 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 65 72  , then the.** er
189e0 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
189f0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
18a00 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 6c 65 66   and *pnPage lef
18a10 74 20 75 6e 63 68 61 6e 67 65 64 2e 20 4f 72 2c  t unchanged. Or,
18a20 0a 2a 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20  .** if the file 
18a30 73 79 73 74 65 6d 20 68 61 73 20 74 6f 20 62 65  system has to be
18a40 20 71 75 65 72 69 65 64 20 66 6f 72 20 74 68 65   queried for the
18a50 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
18a60 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 71 75 65  e and.** the que
18a70 72 79 20 61 74 74 65 6d 70 74 20 72 65 74 75 72  ry attempt retur
18a80 6e 73 20 61 6e 20 49 4f 20 65 72 72 6f 72 2c 20  ns an IO error, 
18a90 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
18aa0 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  e is returned.**
18ab0 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20   and *pnPage is 
18ac0 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
18ad0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
18ae0 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
18af0 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  s successful, th
18b00 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  en SQLITE_OK is 
18b10 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20  returned.** and 
18b20 2a 70 6e 50 61 67 65 20 69 73 20 73 65 74 20 74  *pnPage is set t
18b30 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
18b40 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
18b50 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  abase..*/.int sq
18b60 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
18b70 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
18b80 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b  r, int *pnPage){
18b90 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20  .  Pgno nPage;  
18ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18bb0 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
18bc0 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a  via *pnPage */..
18bd0 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
18be0 72 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  r is already in 
18bf0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
18c00 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
18c10 72 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28  r code. */.  if(
18c20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
18c30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
18c40 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
18c50 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d    }..  /* Determ
18c60 69 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ine the number o
18c70 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66  f pages in the f
18c80 69 6c 65 2e 20 53 74 6f 72 65 20 74 68 69 73 20  ile. Store this 
18c90 69 6e 20 6e 50 61 67 65 2e 20 2a 2f 0a 20 20 69  in nPage. */.  i
18ca0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
18cb0 65 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 6e 50  eValid ){.    nP
18cc0 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  age = pPager->db
18cd0 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Size;.  }else{. 
18ce0 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20     int rc;      
18cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
18d00 72 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ror returned by 
18d10 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a  OsFileSize() */.
18d20 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20      i64 n = 0;  
18d30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
18d40 69 6c 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65  ile size in byte
18d50 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  s returned by Os
18d60 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a 0a 20  FileSize() */.. 
18d70 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
18d80 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
18d90 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
18da0 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f  e );.    if( isO
18db0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
18dc0 26 26 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73  && (0 != (rc = s
18dd0 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
18de0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29  (pPager->fd, &n)
18df0 29 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  )) ){.      page
18e00 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
18e10 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rc);.      retur
18e20 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
18e30 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61  if( n>0 && n<pPa
18e40 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  ger->pageSize ){
18e50 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 31  .      nPage = 1
18e60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18e70 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f     nPage = (Pgno
18e80 29 28 6e 20 2f 20 70 50 61 67 65 72 2d 3e 70 61  )(n / pPager->pa
18e90 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
18ea0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
18eb0 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
18ec0 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  CK ){.      pPag
18ed0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
18ee0 67 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ge;.      pPager
18ef0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e  ->dbFileSize = n
18f00 50 61 67 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Page;.      pPag
18f10 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
18f20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
18f30 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72    /* If the curr
18f40 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ent number of pa
18f50 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ges in the file 
18f60 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
18f70 74 68 65 20 0a 20 20 2a 2a 20 63 6f 6e 66 69 67  the .  ** config
18f80 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67  ured maximum pag
18f90 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65  er number, incre
18fa0 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20  ase the allowed 
18fb0 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68  limit so.  ** th
18fc0 61 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20  at the file can 
18fd0 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20  be read..  */.  
18fe0 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72  if( nPage>pPager
18ff0 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
19000 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
19010 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20   (Pgno)nPage;.  
19020 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
19030 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20  output variable 
19040 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
19050 45 5f 4f 4b 20 2a 2f 0a 20 20 69 66 28 20 70 6e  E_OK */.  if( pn
19060 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 6e 50  Page ){.    *pnP
19070 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d  age = nPage;.  }
19080 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19090 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  _OK;.}.../*.** T
190a0 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c  ry to obtain a l
190b0 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b  ock of type lock
190c0 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61  type on the data
190d0 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a  base file. If.**
190e0 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72   a similar or gr
190f0 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c  eater lock is al
19100 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73  ready held, this
19110 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
19120 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69  o-op.** (returni
19130 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d  ng SQLITE_OK imm
19140 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a  ediately)..**.**
19150 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74 65   Otherwise, atte
19160 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  mpt to obtain th
19170 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c  e lock using sql
19180 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e  ite3OsLock(). In
19190 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73  voke .** the bus
191a0 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68  y callback if th
191b0 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e  e lock is curren
191c0 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  tly not availabl
191d0 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e  e. Repeat .** un
191e0 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c  til the busy cal
191f0 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61  lback returns fa
19200 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65  lse or until the
19210 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20   attempt to .** 
19220 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20  obtain the lock 
19230 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20  succeeds..**.** 
19240 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
19250 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20   on success and 
19260 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
19270 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69   we cannot obtai
19280 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49  n.** the lock. I
19290 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62  f the lock is ob
192a0 74 61 69 6e 65 64 20 73 75 63 63 65 73 73 66 75  tained successfu
192b0 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61 67  lly, set the Pag
192c0 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72  er.state .** var
192d0 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70  iable to locktyp
192e0 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
192f0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
19300 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  t pager_wait_on_
19310 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
19320 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  er, int locktype
19330 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
19340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
19360 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
19370 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61  * The OS lock va
19380 6c 75 65 73 20 6d 75 73 74 20 62 65 20 74 68 65  lues must be the
19390 20 73 61 6d 65 20 61 73 20 74 68 65 20 50 61 67   same as the Pag
193a0 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a  er lock values *
193b0 2f 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  /.  assert( PAGE
193c0 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44  R_SHARED==SHARED
193d0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
193e0 74 28 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  t( PAGER_RESERVE
193f0 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  D==RESERVED_LOCK
19400 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
19410 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45  GER_EXCLUSIVE==E
19420 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
19430 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69  ..  /* If the fi
19440 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  le is currently 
19450 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74 68  unlocked then th
19460 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 75  e size must be u
19470 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65  nknown */.  asse
19480 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
19490 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
194a0 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
194b0 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 0a 20 20  eValid==0 );..  
194c0 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
194d0 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20 6e  is is either a n
194e0 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74 68  o-op (because th
194f0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
19500 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64   is .  ** alread
19510 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f  y held, or one o
19520 66 20 74 68 65 20 74 72 61 6e 73 69 73 74 69 6f  f the transistio
19530 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73 79  ns that the busy
19540 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61  -handler.  ** ma
19550 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72  y be invoked dur
19560 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  ing, according t
19570 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  o the comment ab
19580 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  ove.  ** sqlite3
19590 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
195a0 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ler()..  */.  as
195b0 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 73  sert( (pPager->s
195c0 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a  tate>=locktype).
195d0 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
195e0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
195f0 55 4e 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79  UNLOCK && lockty
19600 70 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44  pe==PAGER_SHARED
19610 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ).       || (pPa
19620 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
19630 52 5f 52 45 53 45 52 56 45 44 20 26 26 20 6c 6f  R_RESERVED && lo
19640 63 6b 74 79 70 65 3d 3d 50 41 47 45 52 5f 45 58  cktype==PAGER_EX
19650 43 4c 55 53 49 56 45 29 0a 20 20 29 3b 0a 0a 20  CLUSIVE).  );.. 
19660 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
19670 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  te>=locktype ){.
19680 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
19690 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
196a0 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d   do {.      rc =
196b0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
196c0 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74  Pager->fd, lockt
196d0 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  ype);.    }while
196e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
196f0 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75  Y && pPager->xBu
19700 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72  syHandler(pPager
19710 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
19720 67 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  g) );.    if( rc
19730 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19740 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
19750 74 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70  te = (u8)locktyp
19760 65 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  e;.      IOTRACE
19770 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22  (("LOCK %p %d\n"
19780 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79  , pPager, lockty
19790 70 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  pe)).    }.  }. 
197a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
197b0 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
197c0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  e in-memory data
197d0 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20  base file image 
197e0 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20  to nPage pages. 
197f0 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
19800 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61  n does not actua
19810 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64  lly modify the d
19820 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
19830 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73  disk. It .** jus
19840 74 20 73 65 74 73 20 74 68 65 20 69 6e 74 65 72  t sets the inter
19850 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
19860 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f   pager object so
19870 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72   that the .** tr
19880 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65  uncation will be
19890 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63   done when the c
198a0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
198b0 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
198c0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
198d0 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
198e0 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
198f0 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
19900 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
19910 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a  >dbSizeValid );.
19920 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19930 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20  ->dbSize>=nPage 
19940 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
19950 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
19960 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
19970 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
19980 20 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nPage;.}../*.**
19990 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
199a0 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
199b0 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
199c0 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
199d0 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
199e0 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
199f0 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
19a00 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
19a10 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
19a20 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
19a30 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
19a40 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
19a50 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
19a60 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
19a70 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
19a80 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
19a90 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
19aa0 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
19ab0 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
19ac0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
19ad0 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
19ae0 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
19af0 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a  a coredump..**.*
19b00 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
19b10 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
19b20 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
19b30 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61  n is active an a
19b40 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
19b50 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
19b60 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  k. If an error o
19b70 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
19b80 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20   rollback .** a 
19b90 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot journal may 
19ba0 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
19bb0 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f  ilesystem but no
19bc0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
19bd0 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  ed.** to the cal
19be0 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ler..*/.int sqli
19bf0 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61  te3PagerClose(Pa
19c00 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
19c10 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
19c20 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
19c30 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
19c40 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70  ignMalloc();.  p
19c50 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
19c60 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   0;.  pPager->ex
19c70 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b  clusiveMode = 0;
19c80 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70  .  pager_reset(p
19c90 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 4d 45  Pager);.  if( ME
19ca0 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72  MDB ){.    pager
19cb0 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
19cc0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
19cd0 20 53 65 74 20 50 61 67 65 72 2e 6a 6f 75 72 6e   Set Pager.journ
19ce0 61 6c 48 64 72 20 74 6f 20 2d 31 20 66 6f 72 20  alHdr to -1 for 
19cf0 74 68 65 20 62 65 6e 65 66 69 74 20 6f 66 20 74  the benefit of t
19d00 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
19d10 6b 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  k() .    ** call
19d20 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 6d 61   which may be ma
19d30 64 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70  de from within p
19d40 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
19d50 6c 62 61 63 6b 28 29 2e 20 49 66 20 69 74 0a 20  lback(). If it. 
19d60 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 2d 31 2c     ** is not -1,
19d70 20 74 68 65 6e 20 74 68 65 20 75 6e 73 79 6e 63   then the unsync
19d80 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 61 6e  ed portion of an
19d90 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
19da0 6c 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20 62 65  le may.    ** be
19db0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74   played back int
19dc0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
19dd0 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
19de0 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 0a  re occurs while.
19df0 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68      ** this is h
19e00 61 70 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61  appening, the da
19e10 74 61 62 61 73 65 20 6d 61 79 20 62 65 63 6f 6d  tabase may becom
19e20 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a  e corrupt..    *
19e30 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  /.    pPager->jo
19e40 75 72 6e 61 6c 48 64 72 20 3d 20 2d 31 3b 0a 20  urnalHdr = -1;. 
19e50 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e     pagerUnlockAn
19e60 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
19e70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
19e80 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
19e90 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  );.  enable_simu
19ea0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
19eb0 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
19ec0 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50  ("CLOSE %d\n", P
19ed0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
19ee0 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c  ;.  IOTRACE(("CL
19ef0 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  OSE %p\n", pPage
19f00 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  r)).  sqlite3OsC
19f10 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
19f20 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46  ;.  sqlite3PageF
19f30 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
19f40 53 70 61 63 65 29 3b 0a 20 20 73 71 6c 69 74 65  Space);.  sqlite
19f50 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61  3PcacheClose(pPa
19f60 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a  ger->pPCache);..
19f70 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
19f80 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70 50  S_CODEC.  if( pP
19f90 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
19fa0 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65   ) pPager->xCode
19fb0 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43  cFree(pPager->pC
19fc0 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  odec);.#endif.. 
19fd0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
19fe0 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 26 26 20  ->aSavepoint && 
19ff0 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  !pPager->pInJour
1a000 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
1a010 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
1a020 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e  >jfd) && !isOpen
1a030 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
1a040 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ;..  sqlite3_fre
1a050 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
1a060 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1a070 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ..#if !defined(N
1a080 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
1a090 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
1a0a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1a0b0 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
1a0c0 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e  page pPg..*/.Pgn
1a0d0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  o sqlite3PagerPa
1a0e0 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20  genumber(DbPage 
1a0f0 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
1a100 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e  pPg->pgno;.}.#en
1a110 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  dif../*.** Incre
1a120 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
1a130 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67  ce count for pag
1a140 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73  e pPg..*/.void s
1a150 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44  qlite3PagerRef(D
1a160 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 73  bPage *pPg){.  s
1a170 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 28  qlite3PcacheRef(
1a180 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  pPg);.}../*.** S
1a190 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ync the journal.
1a1a0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1a1b0 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   make sure all t
1a1c0 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61  he pages that ha
1a1d0 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  ve.** been writt
1a1e0 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
1a1f0 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20  l have actually 
1a200 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66  reached the surf
1a210 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69  ace of the.** di
1a220 73 6b 20 61 6e 64 20 63 61 6e 20 62 65 20 72 65  sk and can be re
1a230 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 65 76  stored in the ev
1a240 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75  ent of a hot-jou
1a250 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  rnal rollback..*
1a260 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 61 67 65  *.** If the Page
1a270 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  r.needSync flag 
1a280 69 73 20 6e 6f 74 20 73 65 74 2c 20 74 68 65 6e  is not set, then
1a290 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1a2a0 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 4f 74  s a.** no-op. Ot
1a2b0 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 63 74  herwise, the act
1a2c0 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64 65  ions required de
1a2d0 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  pend on the jour
1a2e0 6e 61 6c 2d 6d 6f 64 65 0a 2a 2a 20 61 6e 64 20  nal-mode.** and 
1a2f0 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72 61  the device chara
1a300 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74 68  cteristics of th
1a310 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  e the file-syste
1a320 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  m, as follows:.*
1a330 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
1a340 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
1a350 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
1a360 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63  rnal file, no ac
1a370 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20  tion need.**    
1a380 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a   be taken..**.**
1a390 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20     * Otherwise, 
1a3a0 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f  if the device do
1a3b0 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74  es not support t
1a3c0 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70  he SAFE_APPEND p
1a3d0 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20  roperty,.**     
1a3e0 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  then the nRec fi
1a3f0 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  eld of the most 
1a400 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e  recently written
1a410 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a   journal header.
1a420 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74 65  **     is update
1a430 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  d to contain the
1a440 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e   number of journ
1a450 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  al records that 
1a460 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e  have.**     been
1a470 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69   written followi
1a480 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70 61  ng it. If the pa
1a490 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67  ger is operating
1a4a0 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a   in full-sync.**
1a4b0 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20       mode, then 
1a4c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1a4d0 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72   is synced befor
1a4e0 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73 20  e this field is 
1a4f0 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
1a500 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63 65   * If the device
1a510 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
1a520 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c  t the SEQUENTIAL
1a530 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20   property, then 
1a540 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  .**     journal 
1a550 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a  file is synced..
1a560 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65  **.** Or, in pse
1a570 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20  udo-code:.**.** 
1a580 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65    if( NOT <in-me
1a590 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b  mory journal> ){
1a5a0 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20  .**     if( NOT 
1a5b0 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a  SAFE_APPEND ){.*
1a5c0 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c  *       if( <ful
1a5d0 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78  l-sync mode> ) x
1a5e0 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
1a5f0 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c  le>);.**       <
1a600 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c  update nRec fiel
1a610 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20  d>.**     } .** 
1a620 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55      if( NOT SEQU
1a630 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c  ENTIAL ) xSync(<
1a640 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a  journal file>);.
1a650 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65  **   }.**.** The
1a660 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20   Pager.needSync 
1a670 66 6c 61 67 20 69 73 20 6e 65 76 65 72 20 62 65  flag is never be
1a680 20 73 65 74 20 66 6f 72 20 74 65 6d 70 6f 72 61   set for tempora
1a690 72 79 20 66 69 6c 65 73 2c 20 6f 72 20 61 6e 79  ry files, or any
1a6a0 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 72 61 74 69  .** file operati
1a6b0 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
1a6c0 64 65 20 28 50 61 67 65 72 2e 6e 6f 53 79 6e 63  de (Pager.noSync
1a6d0 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f   set to non-zero
1a6e0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  )..**.** If succ
1a6f0 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75  essful, this rou
1a700 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20  tine clears the 
1a710 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
1a720 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a  flag of every .*
1a730 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79  * page currently
1a740 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20   held in memory 
1a750 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1a760 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
1a770 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73  n IO.** error is
1a780 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
1a790 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
1a7a0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1a7b0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
1a7c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
1a7d0 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ncJournal(Pager 
1a7e0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
1a7f0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1a800 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1a810 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
1a820 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  e );.    if( pPa
1a830 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
1a840 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
1a850 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  ODE_MEMORY ){.  
1a860 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20      int rc;     
1a870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a880 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1a890 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20  rn code */.     
1a8a0 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d   const int iDc =
1a8b0 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
1a8c0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
1a8d0 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
1a8e0 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
1a8f0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
1a900 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ;..      if( 0==
1a910 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
1a920 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29  P_SAFE_APPEND) )
1a930 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 72  {.        /* Var
1a940 69 61 62 6c 65 20 69 4e 52 65 63 4f 66 66 73 65  iable iNRecOffse
1a950 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
1a960 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f  offset in the jo
1a970 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20  urnal file.     
1a980 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e 52 65     ** of the nRe
1a990 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d  c field of the m
1a9a0 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69  ost recently wri
1a9b0 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tten journal hea
1a9c0 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  der..        ** 
1a9d0 54 68 69 73 20 66 69 65 6c 64 20 77 69 6c 6c 20  This field will 
1a9e0 62 65 20 75 70 64 61 74 65 64 20 66 6f 6c 6c 6f  be updated follo
1a9f0 77 69 6e 67 20 74 68 65 20 78 53 79 6e 63 28 29  wing the xSync()
1aa00 20 6f 70 65 72 61 74 69 6f 6e 0a 20 20 20 20 20   operation.     
1aa10 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75     ** on the jou
1aa20 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
1aa30 20 20 20 20 20 20 69 36 34 20 69 4e 52 65 63 4f        i64 iNRecO
1aa40 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
1aa50 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a  journalHdr + siz
1aa60 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
1aa70 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  c);..        /* 
1aa80 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73  This block deals
1aa90 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65   with an obscure
1aaa0 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65   problem. If the
1aab0 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e   last connection
1aac0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
1aad0 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64   wrote to this d
1aae0 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65 72  atabase was oper
1aaf0 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74  ating in persist
1ab00 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  ent-journal.    
1ab10 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65      ** mode, the
1ab20 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
1ab30 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20 70  le may at this p
1ab40 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65  oint actually be
1ab50 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20 20   larger.        
1ab60 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f  ** than Pager.jo
1ab70 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20  urnalOff bytes. 
1ab80 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e  If the next thin
1ab90 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g in the journal
1aba0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  .        ** file
1abb0 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61   happens to be a
1abc0 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
1abd0 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72 74  (written as part
1abe0 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
1abf0 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e  ** previous conn
1ac00 65 63 74 69 6f 6e 73 20 74 72 61 6e 73 61 63 74  ections transact
1ac10 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73  ion), and a cras
1ac20 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75  h or power-failu
1ac30 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  re .        ** o
1ac40 63 63 75 72 73 20 61 66 74 65 72 20 6e 52 65 63  ccurs after nRec
1ac50 20 69 73 20 75 70 64 61 74 65 64 20 62 75 74 20   is updated but 
1ac60 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e  before this conn
1ac70 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20  ection writes . 
1ac80 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69         ** anythi
1ac90 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a  ng else to the j
1aca0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20  ournal file (or 
1acb0 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61  commits/rolls ba
1acc0 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20 20  ck its .        
1acd0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  ** transaction),
1ace0 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79   then SQLite may
1acf0 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64   become confused
1ad00 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20   when doing the 
1ad10 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d  .        ** hot-
1ad20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
1ad30 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76   following recov
1ad40 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c  ery. It may roll
1ad50 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20   back all.      
1ad60 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e    ** of this con
1ad70 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74  nections data, t
1ad80 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72  hen proceed to r
1ad90 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20  olling back the 
1ada0 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  old,.        ** 
1adb0 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61  out-of-date data
1adc0 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74   that follows it
1add0 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75  . Database corru
1ade0 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  ption..        *
1adf0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20  *.        ** To 
1ae00 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
1ae10 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  , if the journal
1ae20 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61   file does appea
1ae30 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20  r to contain.   
1ae40 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20       ** a valid 
1ae50 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67  header following
1ae60 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
1ae70 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20  f, then write a 
1ae80 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20  0x00.        ** 
1ae90 62 79 74 65 20 74 6f 20 74 68 65 20 73 74 61 72  byte to the star
1aea0 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65  t of it to preve
1aeb0 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67  nt it from being
1aec0 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20   recognized..   
1aed0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
1aee0 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78  ** Variable iNex
1aef0 74 48 64 72 4f 66 66 73 65 74 20 69 73 20 73 65  tHdrOffset is se
1af00 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  t to the offset 
1af10 61 74 20 77 68 69 63 68 20 74 68 69 73 0a 20 20  at which this.  
1af20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d        ** problem
1af30 61 74 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c  atic header will
1af40 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65 78   occur, if it ex
1af50 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20  ists. aMagic is 
1af60 75 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a  used .        **
1af70 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   as a temporary 
1af80 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63  buffer to inspec
1af90 74 20 74 68 65 20 66 69 72 73 74 20 63 6f 75 70  t the first coup
1afa0 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20  le of bytes of. 
1afb0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f         ** the po
1afc0 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20  tential journal 
1afd0 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20  header..        
1afe0 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  */.        i64 i
1aff0 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20  NextHdrOffset = 
1b000 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
1b010 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1b020 20 20 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a    u8 aMagic[8];.
1b030 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1b040 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
1b050 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
1b060 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  8, iNextHdrOffse
1b070 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
1b080 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1b090 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69   0==memcmp(aMagi
1b0a0 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
1b0b0 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 8) ){.        
1b0c0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
1b0d0 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a  8 zerobyte = 0;.
1b0e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1b0f0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
1b100 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f  ager->jfd, &zero
1b110 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64  byte, 1, iNextHd
1b120 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  rOffset);.      
1b130 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1b140 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
1b150 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
1b160 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
1b170 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1b180 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a   rc;.        }..
1b190 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1b1a0 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
1b1b0 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
1b1c0 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66   file header. If
1b1d0 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   in.        ** f
1b1e0 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20  ull-synchronous 
1b1f0 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
1b200 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68  ournal first. Th
1b210 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a  is ensures that.
1b220 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64          ** all d
1b230 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68  ata has really h
1b240 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f  it the disk befo
1b250 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  re nRec is updat
1b260 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20  ed to mark.     
1b270 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61     ** it as a ca
1b280 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c  ndidate for roll
1b290 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  back..        **
1b2a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
1b2b0 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
1b2c0 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65   if the persiste
1b2d0 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74  nt media support
1b2e0 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  s the.        **
1b2f0 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
1b300 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69  perty. Because i
1b310 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
1b320 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a  s not possible .
1b330 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67          ** for g
1b340 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62  arbage data to b
1b350 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  e appended to th
1b360 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63  e file, the nRec
1b370 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a   field.        *
1b380 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  * is populated w
1b390 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77  ith 0xFFFFFFFF w
1b3a0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
1b3b0 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
1b3c0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64  n.        ** and
1b3d0 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20   never needs to 
1b3e0 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20  be updated..    
1b3f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
1b400 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
1b410 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53  ync && 0==(iDc&S
1b420 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
1b430 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
1b440 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
1b450 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
1b460 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
1b470 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
1b480 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1b490 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
1b4a0 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20  ger)).          
1b4b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
1b4c0 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
1b4d0 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
1b4e0 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  gs);.          i
1b4f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b500 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1b510 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b520 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
1b530 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
1b540 61 67 65 72 2c 20 69 4e 52 65 63 4f 66 66 73 65  ager, iNRecOffse
1b550 74 2c 20 34 29 29 3b 0a 20 20 20 20 20 20 20 20  t, 4));.        
1b560 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
1b570 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4e  (pPager->jfd, iN
1b580 52 65 63 4f 66 66 73 65 74 2c 20 70 50 61 67 65  RecOffset, pPage
1b590 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20  r->nRec);.      
1b5a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b5b0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1b5c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1b5d0 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
1b5e0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
1b5f0 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50  AL) ){.        P
1b600 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
1b610 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
1b620 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1b630 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f  r)));.        IO
1b640 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70  TRACE(("JSYNC %p
1b650 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
1b660 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1b670 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
1b680 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
1b690 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20  nc_flags| .     
1b6a0 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79       (pPager->sy
1b6b0 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45  nc_flags==SQLITE
1b6c0 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54  _SYNC_FULL?SQLIT
1b6d0 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a  E_SYNC_DATAONLY:
1b6e0 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  0).        );.  
1b6f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1b700 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1b710 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1b720 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6a   }..    /* The j
1b730 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20  ournal file was 
1b740 6a 75 73 74 20 73 75 63 63 65 73 73 66 75 6c 6c  just successfull
1b750 79 20 73 79 6e 63 65 64 2e 20 53 65 74 20 50 61  y synced. Set Pa
1b760 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20  ger.needSync .  
1b770 20 20 2a 2a 20 74 6f 20 7a 65 72 6f 20 61 6e 64    ** to zero and
1b780 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52   clear the PGHDR
1b790 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
1b7a0 6f 6e 20 61 6c 6c 20 70 61 67 65 73 73 2e 0a 20  on all pagess.. 
1b7b0 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
1b7c0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
1b7d0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1b7e0 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a  nalStarted = 1;.
1b7f0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
1b800 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28  eClearSyncFlags(
1b810 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
1b820 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1b830 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1b840 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
1b850 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69 6e   is the first in
1b860 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f   a linked list o
1b870 66 20 64 69 72 74 79 20 70 61 67 65 73 20 63 6f  f dirty pages co
1b880 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79 20 74 68  nnected.** by th
1b890 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70  e PgHdr.pDirty p
1b8a0 6f 69 6e 74 65 72 2e 20 54 68 69 73 20 66 75 6e  ointer. This fun
1b8b0 63 74 69 6f 6e 20 77 72 69 74 65 73 20 65 61 63  ction writes eac
1b8c0 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20  h one of the.** 
1b8d0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
1b8e0 69 6e 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74  in the list to t
1b8f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b900 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d  . The argument m
1b910 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72  ay.** be NULL, r
1b920 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 65  epresenting an e
1b930 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e 20 74 68  mpty list. In th
1b940 69 73 20 63 61 73 65 20 74 68 69 73 20 66 75 6e  is case this fun
1b950 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f  ction is.** a no
1b960 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  -op..**.** The p
1b970 61 67 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61  ager must hold a
1b980 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56  t least a RESERV
1b990 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69  ED lock when thi
1b9a0 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  s function.** is
1b9b0 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20   called. Before 
1b9c0 77 72 69 74 69 6e 67 20 61 6e 79 74 68 69 6e 67  writing anything
1b9d0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1b9e0 20 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b   file, this lock
1b9f0 0a 2a 2a 20 69 73 20 75 70 67 72 61 64 65 64 20  .** is upgraded 
1ba00 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
1ba10 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63  lock. If the loc
1ba20 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61  k cannot be obta
1ba30 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ined,.** SQLITE_
1ba40 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
1ba50 20 61 6e 64 20 6e 6f 20 64 61 74 61 20 69 73 20   and no data is 
1ba60 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
1ba70 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1ba80 20 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65   .** If the page
1ba90 72 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  r is a temp-file
1baa0 20 70 61 67 65 72 20 61 6e 64 20 74 68 65 20 61   pager and the a
1bab0 63 74 75 61 6c 20 66 69 6c 65 2d 73 79 73 74 65  ctual file-syste
1bac0 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74  m file.** is not
1bad0 20 79 65 74 20 6f 70 65 6e 2c 20 69 74 20 69 73   yet open, it is
1bae0 20 63 72 65 61 74 65 64 20 61 6e 64 20 6f 70 65   created and ope
1baf0 6e 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64  ned before any d
1bb00 61 74 61 20 69 73 20 0a 2a 2a 20 77 72 69 74 74  ata is .** writt
1bb10 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  en out..**.** On
1bb20 63 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20  ce the lock has 
1bb30 62 65 65 6e 20 75 70 67 72 61 64 65 64 20 61 6e  been upgraded an
1bb40 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c  d, if necessary,
1bb50 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
1bb60 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 73 20 61  ,.** the pages a
1bb70 72 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  re written out t
1bb80 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1bb90 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f 72 64 65  ile in list orde
1bba0 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20  r. Writing.** a 
1bbb0 70 61 67 65 20 69 73 20 73 6b 69 70 70 65 64 20  page is skipped 
1bbc0 69 66 20 69 74 20 6d 65 65 74 73 20 65 69 74 68  if it meets eith
1bbd0 65 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  er of the follow
1bbe0 69 6e 67 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a  ing criteria:.**
1bbf0 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65  .**   * The page
1bc00 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61 74   number is great
1bc10 65 72 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  er than Pager.db
1bc20 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20  Size, or.**   * 
1bc30 54 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57  The PGHDR_DONT_W
1bc40 52 49 54 45 20 66 6c 61 67 20 69 73 20 73 65 74  RITE flag is set
1bc50 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a   on the page..**
1bc60 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e 67 20 6f  .** If writing o
1bc70 75 74 20 61 20 70 61 67 65 20 63 61 75 73 65 73  ut a page causes
1bc80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1bc90 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50 61 67 65  le to grow, Page
1bca0 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20  r.dbFileSize.** 
1bcb0 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72  is updated accor
1bcc0 64 69 6e 67 6c 79 2e 20 49 66 20 70 61 67 65 20  dingly. If page 
1bcd0 31 20 69 73 20 77 72 69 74 74 65 6e 20 6f 75 74  1 is written out
1bce0 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
1bcf0 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61   cached.** in Pa
1bd00 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d  ger.dbFileVers[]
1bd10 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d   is updated to m
1bd20 61 74 63 68 20 74 68 65 20 6e 65 77 20 76 61 6c  atch the new val
1bd30 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ue stored in.** 
1bd40 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1bd50 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72  e..**.** If ever
1bd60 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
1bd70 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
1bd80 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
1bd90 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  an IO error .** 
1bda0 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72  occurs, an IO er
1bdb0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1bdc0 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65  rned. Or, if the
1bdd0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1bde0 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74  cannot.** be obt
1bdf0 61 69 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42 55  ained, SQLITE_BU
1be00 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  SY is returned..
1be10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1be20 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
1be30 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29  st(PgHdr *pList)
1be40 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
1be50 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
1be60 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
1be70 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
1be80 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1be90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bea0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1beb0 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4c 69 73  e */..  if( pLis
1bec0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  t==0 ) return SQ
1bed0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65  LITE_OK;.  pPage
1bee0 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65  r = pList->pPage
1bef0 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  r;..  /* At this
1bf00 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79   point there may
1bf10 20 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53   be either a RES
1bf20 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
1bf30 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  VE lock on the. 
1bf40 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1bf50 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  e. If there is a
1bf60 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53  lready an EXCLUS
1bf70 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f  IVE lock, the fo
1bf80 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c  llowing.  ** cal
1bf90 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  l is a no-op..  
1bfa0 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74  **.  ** Moving t
1bfb0 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53  he lock from RES
1bfc0 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49  ERVED to EXCLUSI
1bfd0 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f  VE actually invo
1bfe0 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20  lves going.  ** 
1bff0 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72  through an inter
1c000 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50 45  mediate state PE
1c010 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49  NDING.   A PENDI
1c020 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73  NG lock prevents
1c030 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72   new.  ** reader
1c040 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67  s from attaching
1c050 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1c060 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69 63   but is unsuffic
1c070 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20  ient for us to. 
1c080 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20   ** write.  The 
1c090 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e  idea of a PENDIN
1c0a0 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65  G lock is to pre
1c0b0 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73  vent new readers
1c0c0 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e   from.  ** comin
1c0d0 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61  g in while we wa
1c0e0 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20  it for existing 
1c0f0 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72  readers to clear
1c100 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c  ..  **.  ** Whil
1c110 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  e the pager is i
1c120 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20 73  n the RESERVED s
1c130 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e  tate, the origin
1c140 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
1c150 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67  .  ** is unchang
1c160 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f  ed and we can ro
1c170 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  llback without h
1c180 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63  aving to playbac
1c190 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e  k the.  ** journ
1c1a0 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67  al into the orig
1c1b0 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
1c1c0 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61  le.  Once we tra
1c1d0 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20  nsition to.  ** 
1c1e0 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65  EXCLUSIVE, it me
1c1f0 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
1c200 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63   file has been c
1c210 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72  hanged and any r
1c220 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c  ollback.  ** wil
1c230 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72  l require a jour
1c240 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20  nal playback..  
1c250 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
1c260 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1c270 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
1c280 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
1c290 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
1c2a0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
1c2b0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69  ..  /* If the fi
1c2c0 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c  le is a temp-fil
1c2d0 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
1c2e0 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20  en opened, open 
1c2f0 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20  it now. It.  ** 
1c300 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
1c310 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68  for rc to be oth
1c320 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
1c330 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e 63 68  K if this branch
1c340 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20  .  ** is taken, 
1c350 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  as pager_wait_on
1c360 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  _lock() is a no-
1c370 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65  op for temp-file
1c380 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69  s..  */.  if( !i
1c390 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1c3a0 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
1c3b0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1c3c0 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
1c3d0 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  OK );.    rc = p
1c3e0 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61  agerOpentemp(pPa
1c3f0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c  ger, pPager->fd,
1c400 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
1c410 73 29 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  s);.  }..  while
1c420 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c430 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  && pList ){.    
1c440 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73  Pgno pgno = pLis
1c450 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a  t->pgno;..    /*
1c460 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69   If there are di
1c470 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  rty pages in the
1c480 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68   page cache with
1c490 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72   page numbers gr
1c4a0 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  eater.    ** tha
1c4b0 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
1c4c0 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74  this means sqlit
1c4d0 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
1c4e0 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65  mage() was calle
1c4f0 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65  d to.    ** make
1c500 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65   the file smalle
1c510 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79  r (presumably by
1c520 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64   auto-vacuum cod
1c530 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65  e). Do not write
1c540 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68  .    ** any such
1c550 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69   pages to the fi
1c560 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
1c570 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77  * Also, do not w
1c580 72 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67  rite out any pag
1c590 65 20 74 68 61 74 20 68 61 73 20 74 68 65 20 50  e that has the P
1c5a0 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20  GHDR_DONT_WRITE 
1c5b0 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20  flag.    ** set 
1c5c0 28 73 65 74 20 62 79 20 73 71 6c 69 74 65 33 50  (set by sqlite3P
1c5d0 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29  agerDontWrite())
1c5e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1c5f0 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64   pgno<=pPager->d
1c600 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69  bSize && 0==(pLi
1c610 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  st->flags&PGHDR_
1c620 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20  DONT_WRITE) ){. 
1c630 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20       i64 offset 
1c640 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
1c650 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1c660 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f  ;   /* Offset to
1c670 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20   write */.      
1c680 63 68 61 72 20 2a 70 44 61 74 61 3b 20 20 20 20  char *pData;    
1c690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c6b0 2a 20 44 61 74 61 20 74 6f 20 77 72 69 74 65 20  * Data to write 
1c6c0 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20 20 2f 2a  */    ..      /*
1c6d0 20 45 6e 63 6f 64 65 20 74 68 65 20 64 61 74 61   Encode the data
1c6e0 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f  base */.      CO
1c6f0 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69  DEC2(pPager, pLi
1c700 73 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c  st->pData, pgno,
1c710 20 36 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54   6, return SQLIT
1c720 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 29 3b  E_NOMEM, pData);
1c730 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ..      /* Write
1c740 20 6f 75 74 20 74 68 65 20 70 61 67 65 20 64 61   out the page da
1c750 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ta. */.      rc 
1c760 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1c770 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61  (pPager->fd, pDa
1c780 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
1c790 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a  Size, offset);..
1c7a0 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65        /* If page
1c7b0 20 31 20 77 61 73 20 6a 75 73 74 20 77 72 69 74   1 was just writ
1c7c0 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65  ten, update Page
1c7d0 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20  r.dbFileVers to 
1c7e0 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74  match.      ** t
1c7f0 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f  he value now sto
1c800 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  red in the datab
1c810 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69  ase file. If wri
1c820 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20  ting this .     
1c830 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64 20   ** page caused 
1c840 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c850 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74  e to grow, updat
1c860 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20  e dbFileSize. . 
1c870 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1c880 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
1c890 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
1c8a0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
1c8b0 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a   &pData[24], siz
1c8c0 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
1c8d0 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
1c8e0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  }.      if( pgno
1c8f0 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
1c900 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ize ){.        p
1c910 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
1c920 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20  e = pgno;.      
1c930 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  }..      /* Upda
1c940 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62  te any backup ob
1c950 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68  jects copying th
1c960 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1c970 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20  is pager. */.   
1c980 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
1c990 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
1c9a0 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
1c9b0 38 20 2a 29 70 44 61 74 61 29 3b 0a 0a 20 20 20  8 *)pData);..   
1c9c0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
1c9d0 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
1c9e0 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
1c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca00 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
1ca10 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
1ca20 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29  pagehash(pList))
1ca30 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
1ca40 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e  (("PGOUT %p %d\n
1ca50 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
1ca60 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
1ca70 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
1ca80 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29  r_writedb_count)
1ca90 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
1caa0 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74  CR(pPager->nWrit
1cab0 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
1cac0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
1cad0 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67  ("NOSTORE %d pag
1cae0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
1caf0 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29  (pPager), pgno))
1cb00 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
1cb10 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
1cb20 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67  S.    pList->pag
1cb30 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
1cb40 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23  gehash(pList);.#
1cb50 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20  endif.    pList 
1cb60 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
1cb70 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1cb80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  c;.}../*.** Appe
1cb90 6e 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74  nd a record of t
1cba0 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
1cbb0 20 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f 20   of page pPg to 
1cbc0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
1cbd0 20 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 63   .** It is the c
1cbe0 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62  allers responsib
1cbf0 69 6c 69 74 79 20 74 6f 20 75 73 65 20 73 75 62  ility to use sub
1cc00 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29 20  jRequiresPage() 
1cc10 74 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61  to check .** tha
1cc20 74 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72  t it is really r
1cc30 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 63  equired before c
1cc40 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
1cc50 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  tion..**.** If s
1cc60 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74  uccessful, set t
1cc70 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  he bit correspon
1cc80 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e  ding to pPg->pgn
1cc90 6f 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 73  o in the bitvecs
1cca0 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e  .** for all open
1ccb0 20 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f   savepoints befo
1ccc0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
1ccd0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1cce0 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
1ccf0 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
1cd00 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
1cd10 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20   an IO.** error 
1cd20 63 6f 64 65 20 69 66 20 74 68 65 20 61 74 74 65  code if the atte
1cd30 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20  mpt to write to 
1cd40 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
1cd50 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51  fails, or .** SQ
1cd60 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20  LITE_NOMEM if a 
1cd70 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69  malloc fails whi
1cd80 6c 65 20 73 65 74 74 69 6e 67 20 61 20 62 69 74  le setting a bit
1cd90 20 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a   in a savepoint.
1cda0 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74  ** bitvec..*/.st
1cdb0 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72  atic int subjour
1cdc0 6e 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70  nalPage(PgHdr *p
1cdd0 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Pg){.  int rc = 
1cde0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
1cdf0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1ce00 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
1ce10 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
1ce20 6a 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64  jfd) ){.    void
1ce30 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70   *pData = pPg->p
1ce40 44 61 74 61 3b 0a 20 20 20 20 69 36 34 20 6f 66  Data;.    i64 of
1ce50 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e  fset = pPager->n
1ce60 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72  SubRec*(4+pPager
1ce70 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1ce80 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a   char *pData2;..
1ce90 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
1cea0 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
1ceb0 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53  gno, 7, return S
1cec0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61  QLITE_NOMEM, pDa
1ced0 74 61 32 29 3b 0a 20 20 20 20 50 41 47 45 52 54  ta2);.    PAGERT
1cee0 52 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52  RACE(("STMT-JOUR
1cef0 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
1cf00 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1cf10 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b  r), pPg->pgno));
1cf20 0a 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20  .  .    assert( 
1cf30 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
1cf40 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e  g) || pPg->pgno>
1cf50 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
1cf60 7a 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77  ze );.    rc = w
1cf70 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
1cf80 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c  r->sjfd, offset,
1cf90 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1cfa0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1cfb0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
1cfc0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
1cfd0 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44  pPager->sjfd, pD
1cfe0 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61  ata2, pPager->pa
1cff0 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34  geSize, offset+4
1d000 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
1d010 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d020 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
1d030 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61  nSubRec++;.    a
1d040 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
1d050 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20  Savepoint>0 );. 
1d060 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76     rc = addToSav
1d070 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
1d080 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
1d090 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1d0a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1d0b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1d0c0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
1d0d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1d0e0 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68  led by the pcach
1d0f0 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20  e layer when it 
1d100 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65  has reached some
1d110 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20  .** soft memory 
1d120 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74  limit. The first
1d130 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
1d140 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65  ointer to a Page
1d150 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73  r object.** (cas
1d160 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54  t as a void*). T
1d170 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61  he pager is alwa
1d180 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28  ys 'purgeable' (
1d190 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  not an in-memory
1d1a0 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54  .** database). T
1d1b0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1d1c0 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  nt is a referenc
1d1d0 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74  e to a page that
1d1e0 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   is .** currentl
1d1f0 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20  y dirty but has 
1d200 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
1d210 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70  eferences. The p
1d220 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73  age.** is always
1d230 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1d240 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
1d250 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
1d260 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65  first .** argume
1d270 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  nt..**.** The jo
1d280 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  b of this functi
1d290 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50  on is to make pP
1d2a0 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69  g clean by writi
1d2b0 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a  ng its contents.
1d2c0 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ** out to the da
1d2d0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20  tabase file, if 
1d2e0 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d  possible. This m
1d2f0 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69  ay involve synci
1d300 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  ng the.** journa
1d310 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49  l file. .**.** I
1d320 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71  f successful, sq
1d330 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
1d340 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  lean() is called
1d350 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64   on the page and
1d360 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
1d370 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
1d380 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
1d390 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61  ile trying to ma
1d3a0 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63  ke the.** page c
1d3b0 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72  lean, the IO err
1d3c0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1d3d0 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65  ned. If the page
1d3e0 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61   cannot be.** ma
1d3f0 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d  de clean for som
1d400 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20  e other reason, 
1d410 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
1d420 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  urs, then SQLITE
1d430 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
1d440 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61  ed by sqlite3Pca
1d450 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69  cheMakeClean() i
1d460 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f  s not called..*/
1d470 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1d480 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c  rStress(void *p,
1d490 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
1d4a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1d4b0 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e  (Pager *)p;.  in
1d4c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1d4d0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ;..  assert( pPg
1d4e0 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
1d4f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1d500 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
1d510 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  IRTY );..  /* Th
1d520 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67  e doNotSync flag
1d530 20 69 73 20 73 65 74 20 62 79 20 74 68 65 20 73   is set by the s
1d540 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1d550 28 29 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c  () function whil
1d560 65 20 69 74 0a 20 20 2a 2a 20 69 73 20 6a 6f 75  e it.  ** is jou
1d570 72 6e 61 6c 6c 69 6e 67 20 61 20 73 65 74 20 6f  rnalling a set o
1d580 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 64 61  f two or more da
1d590 74 61 62 61 73 65 20 70 61 67 65 73 20 74 68 61  tabase pages tha
1d5a0 74 20 61 72 65 20 73 74 6f 72 65 64 0a 20 20 2a  t are stored.  *
1d5b0 2a 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 64 69  * on the same di
1d5c0 73 6b 20 73 65 63 74 6f 72 2e 20 53 79 6e 63 69  sk sector. Synci
1d5d0 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ng the journal i
1d5e0 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 77 68  s not allowed wh
1d5f0 69 6c 65 0a 20 20 2a 2a 20 74 68 69 73 20 69 73  ile.  ** this is
1d600 20 68 61 70 70 65 6e 69 6e 67 20 61 73 20 69 74   happening as it
1d610 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   is important th
1d620 61 74 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f  at all members o
1d630 66 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 65  f such a.  ** se
1d640 74 20 6f 66 20 70 61 67 65 73 20 61 72 65 20 73  t of pages are s
1d650 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 74 6f  ynced to disk to
1d660 67 65 74 68 65 72 2e 20 53 6f 2c 20 69 66 20 74  gether. So, if t
1d670 68 65 20 70 61 67 65 20 74 68 69 73 20 66 75 6e  he page this fun
1d680 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 72  ction.  ** is tr
1d690 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 63 6c 65  ying to make cle
1d6a0 61 6e 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  an will require 
1d6b0 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 61  a journal sync a
1d6c0 6e 64 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63  nd the doNotSync
1d6d0 0a 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65  .  ** flag is se
1d6e0 74 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  t, return withou
1d6f0 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
1d700 2e 20 54 68 65 20 70 63 61 63 68 65 20 6c 61 79  . The pcache lay
1d710 65 72 20 77 69 6c 6c 0a 20 20 2a 2a 20 6a 75 73  er will.  ** jus
1d720 74 20 68 61 76 65 20 74 6f 20 67 6f 20 61 68 65  t have to go ahe
1d730 61 64 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20  ad and allocate 
1d740 61 20 6e 65 77 20 70 61 67 65 20 62 75 66 66 65  a new page buffe
1d750 72 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 2a  r instead of.  *
1d760 2a 20 72 65 75 73 69 6e 67 20 70 50 67 2e 0a 20  * reusing pPg.. 
1d770 20 2a 2a 0a 20 20 2a 2a 20 53 69 6d 69 6c 61 72   **.  ** Similar
1d780 6c 79 2c 20 69 66 20 74 68 65 20 70 61 67 65 72  ly, if the pager
1d790 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74   has already ent
1d7a0 65 72 65 64 20 74 68 65 20 65 72 72 6f 72 20 73  ered the error s
1d7b0 74 61 74 65 2c 20 64 6f 20 6e 6f 74 0a 20 20 2a  tate, do not.  *
1d7c0 2a 20 74 72 79 20 74 6f 20 77 72 69 74 65 20 74  * try to write t
1d7d0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70  he contents of p
1d7e0 50 67 20 74 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f  Pg to disk..  */
1d7f0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
1d800 72 72 43 6f 64 65 20 7c 7c 20 28 70 50 61 67 65  rrCode || (pPage
1d810 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 26 26 20  r->doNotSync && 
1d820 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
1d830 5f 4e 45 45 44 5f 53 59 4e 43 29 20 29 7b 0a 20  _NEED_SYNC) ){. 
1d840 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1d850 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  _OK;.  }..  /* S
1d860 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
1d870 66 69 6c 65 20 69 66 20 72 65 71 75 69 72 65 64  file if required
1d880 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e  . */.  if( pPg->
1d890 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
1d8a0 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 72 63 20  _SYNC ){.    rc 
1d8b0 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
1d8c0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
1d8d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1d8e0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
1d8f0 20 26 26 20 0a 20 20 20 20 20 20 21 28 70 50 61   && .      !(pPa
1d900 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
1d910 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
1d920 4f 44 45 5f 4d 45 4d 4f 52 59 29 20 26 26 0a 20  ODE_MEMORY) &&. 
1d930 20 20 20 20 20 21 28 73 71 6c 69 74 65 33 4f 73       !(sqlite3Os
1d940 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1d950 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
1d960 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
1d970 41 46 45 5f 41 50 50 45 4e 44 29 0a 20 20 20 20  AFE_APPEND).    
1d980 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
1d990 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
1d9a0 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
1d9b0 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
1d9c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
1d9d0 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  f the page numbe
1d9e0 72 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 69  r of this page i
1d9f0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
1da00 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
1da10 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62  f.  ** the datab
1da20 61 73 65 20 69 6d 61 67 65 2c 20 69 74 20 6d 61  ase image, it ma
1da30 79 20 6e 65 65 64 20 74 6f 20 62 65 20 77 72 69  y need to be wri
1da40 74 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d  tten to the sub-
1da50 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 20 54 68  journal..  ** Th
1da60 69 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68  is is because th
1da70 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  e call to pager_
1da80 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29  write_pagelist()
1da90 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a   below will not.
1daa0 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72    ** actually wr
1dab0 69 74 65 20 64 61 74 61 20 74 6f 20 74 68 65 20  ite data to the 
1dac0 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73  file in this cas
1dad0 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e  e..  **.  ** Con
1dae0 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
1daf0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ing sequence of 
1db00 65 76 65 6e 74 73 3a 0a 20 20 2a 2a 0a 20 20 2a  events:.  **.  *
1db10 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20  *   BEGIN;.  ** 
1db20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67      <journal pag
1db30 65 20 58 3e 0a 20 20 2a 2a 20 20 20 20 20 3c 6d  e X>.  **     <m
1db40 6f 64 69 66 79 20 70 61 67 65 20 58 3e 0a 20 20  odify page X>.  
1db50 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54  **     SAVEPOINT
1db60 20 73 70 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20   sp;.  **       
1db70 3c 73 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65  <shrink database
1db80 20 66 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73   file to Y pages
1db90 3e 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67  >.  **       pag
1dba0 65 72 53 74 72 65 73 73 28 70 61 67 65 20 58 29  erStress(page X)
1dbb0 0a 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41  .  **     ROLLBA
1dbc0 43 4b 20 54 4f 20 73 70 3b 0a 20 20 2a 2a 0a 20  CK TO sp;.  **. 
1dbd0 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68   ** If (X>Y), th
1dbe0 65 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74 72  en when pagerStr
1dbf0 65 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61  ess is called pa
1dc00 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ge X will not be
1dc10 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 6f 75   written.  ** ou
1dc20 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
1dc30 65 20 66 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c  e file, but will
1dc40 20 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d   be dropped from
1dc50 20 74 68 65 20 63 61 63 68 65 2e 20 54 68 65 6e   the cache. Then
1dc60 2c 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  ,.  ** following
1dc70 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54   the "ROLLBACK T
1dc80 4f 20 73 70 22 20 73 74 61 74 65 6d 65 6e 74 2c  O sp" statement,
1dc90 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 58 20   reading page X 
1dca0 77 69 6c 6c 20 72 65 61 64 0a 20 20 2a 2a 20 64  will read.  ** d
1dcb0 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ata from the dat
1dcc0 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73  abase file. This
1dcd0 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70   will be the cop
1dce0 79 20 6f 66 20 70 61 67 65 20 58 20 61 73 20 69  y of page X as i
1dcf0 74 0a 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20  t.  ** was when 
1dd00 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1dd10 73 74 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20  started, not as 
1dd20 69 74 20 77 61 73 20 77 68 65 6e 20 22 53 41 56  it was when "SAV
1dd30 45 50 4f 49 4e 54 20 73 70 22 0a 20 20 2a 2a 20  EPOINT sp".  ** 
1dd40 77 61 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20  was executed..  
1dd50 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75  **.  ** The solu
1dd60 74 69 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65  tion is to write
1dd70 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74   the current dat
1dd80 61 20 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74  a for page X int
1dd90 6f 20 74 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d  o the .  ** sub-
1dda0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77  journal file now
1ddb0 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
1ddc0 6c 72 65 61 64 79 20 74 68 65 72 65 29 2c 20 73  lready there), s
1ddd0 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20  o that it will. 
1dde0 20 2a 2a 20 62 65 20 72 65 73 74 6f 72 65 64 20   ** be restored 
1ddf0 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 76  to its current v
1de00 61 6c 75 65 20 77 68 65 6e 20 74 68 65 20 22 52  alue when the "R
1de10 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 69  OLLBACK TO sp" i
1de20 73 20 0a 20 20 2a 2a 20 65 78 65 63 75 74 65 64  s .  ** executed
1de30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
1de40 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
1de50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
1de60 64 62 53 69 7a 65 20 26 26 20 73 75 62 6a 52 65  dbSize && subjRe
1de70 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
1de80 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 75 62 6a  ){.    rc = subj
1de90 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b  ournalPage(pPg);
1dea0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65  .  }..  /* Write
1deb0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1dec0 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f   the page out to
1ded0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1dee0 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  le. */.  if( rc=
1def0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1df00 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
1df10 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  0;.    rc = page
1df20 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
1df30 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  (pPg);.  }..  /*
1df40 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
1df50 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66  s clean. */.  if
1df60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1df70 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  ){.    PAGERTRAC
1df80 45 28 28 22 53 54 52 45 53 53 20 25 64 20 70 61  E(("STRESS %d pa
1df90 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
1dfa0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
1dfb0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69  pgno));.    sqli
1dfc0 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
1dfd0 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20  an(pPg);.  }..  
1dfe0 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
1dff0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
1e000 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  }.../*.** Alloca
1e010 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
1e020 65 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62  e a new Pager ob
1e030 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61 20 70  ject and put a p
1e040 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20  ointer to it.** 
1e050 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65  in *ppPager. The
1e060 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76   pager should ev
1e070 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65  entually be free
1e080 64 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a  d by passing it.
1e090 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ** to sqlite3Pag
1e0a0 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a  erClose()..**.**
1e0b0 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61   The zFilename a
1e0c0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70  rgument is the p
1e0d0 61 74 68 20 74 6f 20 74 68 65 20 64 61 74 61 62  ath to the datab
1e0e0 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
1e0f0 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  ..** If zFilenam
1e100 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61  e is NULL then a
1e110 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20   randomly-named 
1e120 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
1e130 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
1e140 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c   used as the fil
1e150 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20  e to be cached. 
1e160 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  Temporary files 
1e170 61 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a  are be deleted.*
1e180 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
1e190 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c  when they are cl
1e1a0 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61  osed. If zFilena
1e1b0 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
1e1c0 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e   then .** all in
1e1d0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c  formation is hel
1e1e0 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69  d in cache. It i
1e1f0 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20  s never written 
1e200 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69  to disk. .** Thi
1e210 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  s can be used to
1e220 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e   implement an in
1e230 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
1e240 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74  ..**.** The nExt
1e250 72 61 20 70 61 72 61 6d 65 74 65 72 20 73 70 65  ra parameter spe
1e260 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65  cifies the numbe
1e270 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
1e280 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  ace allocated.**
1e290 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68   along with each
1e2a0 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
1e2b0 20 54 68 69 73 20 73 70 61 63 65 20 69 73 20 61   This space is a
1e2c0 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20  vailable to the 
1e2d0 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20  user.** via the 
1e2e0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
1e2f0 78 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a  xtra() API..**.*
1e300 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72 67 75  * The flags argu
1e310 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20  ment is used to 
1e320 73 70 65 63 69 66 79 20 70 72 6f 70 65 72 74 69  specify properti
1e330 65 73 20 74 68 61 74 20 61 66 66 65 63 74 20 74  es that affect t
1e340 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  he.** operation 
1e350 6f 66 20 74 68 65 20 70 61 67 65 72 2e 20 49 74  of the pager. It
1e360 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65   should be passe
1e370 64 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63  d some bitwise c
1e380 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66  ombination.** of
1e390 20 74 68 65 20 50 41 47 45 52 5f 4f 4d 49 54 5f   the PAGER_OMIT_
1e3a0 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 50 41 47 45  JOURNAL and PAGE
1e3b0 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66 6c  R_NO_READLOCK fl
1e3c0 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ags..**.** The v
1e3d0 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65  fsFlags paramete
1e3e0 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74  r is a bitmask t
1e3f0 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c  o pass to the fl
1e400 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a  ags parameter.**
1e410 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20   of the xOpen() 
1e420 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75  method of the su
1e430 70 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20  pplied VFS when 
1e440 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a  opening files. .
1e450 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
1e460 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c  er object is all
1e470 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 73  ocated and the s
1e480 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70  pecified file op
1e490 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73  ened .** success
1e4a0 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b  fully, SQLITE_OK
1e4b0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1e4c0 20 2a 70 70 50 61 67 65 72 20 73 65 74 20 74 6f   *ppPager set to
1e4d0 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65   point to.** the
1e4e0 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63   new pager objec
1e4f0 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  t. If an error o
1e500 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20  ccurs, *ppPager 
1e510 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a  is set to NULL.*
1e520 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65  * and error code
1e530 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20   returned. This 
1e540 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74  function may ret
1e550 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1e560 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c  .** (sqlite3Mall
1e570 6f 63 28 29 20 69 73 20 75 73 65 64 20 74 6f 20  oc() is used to 
1e580 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29  allocate memory)
1e590 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  , SQLITE_CANTOPE
1e5a0 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73  N or .** various
1e5b0 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65   SQLITE_IO_XXX e
1e5c0 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrors..*/.int sq
1e5d0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a  lite3PagerOpen(.
1e5e0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1e5f0 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  Vfs,       /* Th
1e600 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73  e virtual file s
1e610 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a  ystem to use */.
1e620 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65    Pager **ppPage
1e630 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  r,         /* OU
1e640 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61  T: Return the Pa
1e650 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65  ger structure he
1e660 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  re */.  const ch
1e670 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
1e680 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1e690 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
1e6a0 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e   open */.  int n
1e6b0 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20  Extra,          
1e6c0 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74      /* Extra byt
1e6d0 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63  es append to eac
1e6e0 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  h in-memory page
1e6f0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
1e700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e710 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c  * flags controll
1e720 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f  ing this file */
1e730 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  .  int vfsFlags 
1e740 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
1e750 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
1e760 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  ugh to sqlite3_v
1e770 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b  fs.xOpen() */.){
1e780 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50  .  u8 *pPtr;.  P
1e790 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30  ager *pPager = 0
1e7a0 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72  ;       /* Pager
1e7b0 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63   object to alloc
1e7c0 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a  ate and return *
1e7d0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
1e7e0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20  ITE_OK;      /* 
1e7f0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1e800 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20   int tempFile = 
1e810 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  0;        /* Tru
1e820 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73  e for temp files
1e830 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72   (incl. in-memor
1e840 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e  y files) */.  in
1e850 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20  t memDb = 0;    
1e860 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1e870 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d  f this is an in-
1e880 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20  memory file */. 
1e890 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20   int readOnly = 
1e8a0 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  0;        /* Tru
1e8b0 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72  e if this is a r
1e8c0 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f  ead-only file */
1e8d0 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69  .  int journalFi
1e8e0 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42  leSize;     /* B
1e8f0 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ytes to allocate
1e900 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61   for each journa
1e910 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  l fd */.  char *
1e920 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20  zPathname = 0;  
1e930 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20     /* Full path 
1e940 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  to database file
1e950 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e   */.  int nPathn
1e960 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ame = 0;       /
1e970 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1e980 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a  s in zPathname *
1e990 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e  /.  int useJourn
1e9a0 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  al = (flags & PA
1e9b0 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  GER_OMIT_JOURNAL
1e9c0 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74  )==0; /* False t
1e9d0 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a  o omit journal *
1e9e0 2f 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f  /.  int noReadlo
1e9f0 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  ck = (flags & PA
1ea00 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29  GER_NO_READLOCK)
1ea10 21 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f  !=0;  /* True to
1ea20 20 6f 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b 20   omit read-lock 
1ea30 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53  */.  int pcacheS
1ea40 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ize = sqlite3Pca
1ea50 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20  cheSize();      
1ea60 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c   /* Bytes to all
1ea70 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63 68 65  ocate for PCache
1ea80 20 2a 2f 0a 20 20 75 31 36 20 73 7a 50 61 67 65   */.  u16 szPage
1ea90 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45  Dflt = SQLITE_DE
1eaa0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
1eab0 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67    /* Default pag
1eac0 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 2f 2a 20  e size */..  /* 
1ead0 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
1eae0 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65 71  uch space is req
1eaf0 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a  uired for each j
1eb00 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64  ournal file-hand
1eb10 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61  le.  ** (there a
1eb20 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20  re two of them, 
1eb30 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
1eb40 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75   and the sub-jou
1eb50 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a  rnal). This.  **
1eb60 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
1eb70 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66  space required f
1eb80 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
1eb90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
1eba0 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20  dle .  ** and a 
1ebb0 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20  regular journal 
1ebc0 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74  file-handle. Not
1ebd0 65 20 74 68 61 74 20 61 20 22 72 65 67 75 6c 61  e that a "regula
1ebe0 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65  r journal-handle
1ebf0 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20  ".  ** may be a 
1ec00 77 72 61 70 70 65 72 20 63 61 70 61 62 6c 65 20  wrapper capable 
1ec10 6f 66 20 63 61 63 68 69 6e 67 20 74 68 65 20 66  of caching the f
1ec20 69 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20  irst portion of 
1ec30 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  the journal.  **
1ec40 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20   file in memory 
1ec50 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
1ec60 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
1ec70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20  timization (see 
1ec80 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c  .  ** source fil
1ec90 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20  e journal.c)..  
1eca0 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
1ecb0 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
1ecc0 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72  )>sqlite3MemJour
1ecd0 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20  nalSize() ){.   
1ece0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
1ecf0 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65   = ROUND8(sqlite
1ed00 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
1ed10 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  s));.  }else{.  
1ed20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
1ed30 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74  e = ROUND8(sqlit
1ed40 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65  e3MemJournalSize
1ed50 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ());.  }..  /* S
1ed60 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  et the output va
1ed70 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69  riable to NULL i
1ed80 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20  n case an error 
1ed90 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70  occurs. */.  *pp
1eda0 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a  Pager = 0;..  /*
1edb0 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f   Compute and sto
1edc0 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  re the full path
1edd0 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63  name in an alloc
1ede0 61 74 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e  ated buffer poin
1edf0 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a  ted.  ** to by z
1ee00 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68  Pathname, length
1ee10 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20   nPathname. Or, 
1ee20 69 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d  if this is a tem
1ee30 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a  porary file,.  *
1ee40 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61  * leave both nPa
1ee50 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68  thname and zPath
1ee60 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20  name set to 0.. 
1ee70 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
1ee80 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
1ee90 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74 68  [0] ){.    nPath
1eea0 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
1eeb0 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a  athname+1;.    z
1eec0 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
1eed0 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61  e3Malloc(nPathna
1eee0 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a  me*2);.    if( z
1eef0 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Pathname==0 ){. 
1ef00 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1ef10 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
1ef20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ef30 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20  MIT_MEMORYDB.   
1ef40 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c   if( strcmp(zFil
1ef50 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22  ename,":memory:"
1ef60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  )==0 ){.      me
1ef70 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a  mDb = 1;.      z
1ef80 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b  Pathname[0] = 0;
1ef90 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
1efa0 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 50  f.    {.      zP
1efb0 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20  athname[0] = 0; 
1efc0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69  /* Make sure ini
1efd0 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66  tialized even if
1efe0 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20   FullPathname() 
1eff0 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20 72  fails */.      r
1f000 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c  c = sqlite3OsFul
1f010 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
1f020 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68  zFilename, nPath
1f030 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29  name, zPathname)
1f040 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 50 61  ;.    }..    nPa
1f050 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
1f060 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61  Strlen30(zPathna
1f070 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  me);.    if( rc=
1f080 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50  =SQLITE_OK && nP
1f090 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e  athname+8>pVfs->
1f0a0 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  mxPathname ){.  
1f0b0 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
1f0c0 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e  ch is taken when
1f0d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74   the journal pat
1f0e0 68 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20  h required by.  
1f0f0 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
1f100 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ase being opened
1f110 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68   will be more th
1f120 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  an pVfs->mxPathn
1f130 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  ame.      ** byt
1f140 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68  es in length. Th
1f150 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74  is means the dat
1f160 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20  abase cannot be 
1f170 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a  opened,.      **
1f180 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20   as it will not 
1f190 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f  be possible to o
1f1a0 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
1f1b0 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20  file or even.   
1f1c0 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20     ** check for 
1f1d0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65  a hot-journal be
1f1e0 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20  fore reading..  
1f1f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
1f200 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
1f210 4e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  N;.    }.    if(
1f220 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1f230 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1f240 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b  free(zPathname);
1f250 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1f260 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1f270 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
1f280 79 20 66 6f 72 20 74 68 65 20 50 61 67 65 72 20  y for the Pager 
1f290 73 74 72 75 63 74 75 72 65 2c 20 50 43 61 63 68  structure, PCach
1f2a0 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20  e object, the.  
1f2b0 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64 65  ** three file de
1f2c0 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64  scriptors, the d
1f2d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
1f2e0 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  e and the journa
1f2f0 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d  l .  ** file nam
1f300 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e  e. The layout in
1f310 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f   memory is as fo
1f320 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  llows:.  **.  **
1f330 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63       Pager objec
1f340 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1f350 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67       (sizeof(Pag
1f360 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  er) bytes).  ** 
1f370 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63      PCache objec
1f380 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1f390 20 20 20 20 28 73 71 6c 69 74 65 33 50 63 61 63      (sqlite3Pcac
1f3a0 68 65 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a  heSize() bytes).
1f3b0 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73    **     Databas
1f3c0 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  e file handle   
1f3d0 20 20 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e           (pVfs->
1f3e0 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a  szOsFile bytes).
1f3f0 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75    **     Sub-jou
1f400 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
1f410 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61           (journa
1f420 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29  lFileSize bytes)
1f430 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a  .  **     Main j
1f440 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
1f450 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e  le        (journ
1f460 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73  alFileSize bytes
1f470 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62  ).  **     Datab
1f480 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20  ase file name   
1f490 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74             (nPat
1f4a0 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20  hname+1 bytes). 
1f4b0 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20   **     Journal 
1f4c0 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20  file name       
1f4d0 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61          (nPathna
1f4e0 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20  me+8+1 bytes).  
1f4f0 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20  */.  pPtr = (u8 
1f500 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
1f510 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28  ero(.    ROUND8(
1f520 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29  sizeof(*pPager))
1f530 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72   +      /* Pager
1f540 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
1f550 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53    ROUND8(pcacheS
1f560 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20 20  ize) +          
1f570 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63   /* PCache objec
1f580 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28  t */.    ROUND8(
1f590 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20  pVfs->szOsFile) 
1f5a0 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d  +       /* The m
1f5b0 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20  ain db file */. 
1f5c0 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
1f5d0 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20  ze * 2 +        
1f5e0 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75    /* The two jou
1f5f0 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20  rnal files */ . 
1f600 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31     nPathname + 1
1f610 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
1f620 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a    /* zFilename *
1f630 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  /.    nPathname 
1f640 2b 20 38 20 2b 20 31 20 20 20 20 20 20 20 20 20  + 8 + 1         
1f650 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c       /* zJournal
1f660 20 2a 2f 0a 20 20 29 3b 0a 20 20 61 73 73 65 72   */.  );.  asser
1f670 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
1f680 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49  IGNMENT(SQLITE_I
1f690 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61  NT_TO_PTR(journa
1f6a0 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20  lFileSize)) );. 
1f6b0 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20   if( !pPtr ){.  
1f6c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1f6d0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72  Pathname);.    r
1f6e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1f6f0 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  EM;.  }.  pPager
1f700 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   =              
1f710 28 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a  (Pager*)(pPtr);.
1f720 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68    pPager->pPCach
1f730 65 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29  e =    (PCache*)
1f740 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
1f750 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29  sizeof(*pPager))
1f760 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20  );.  pPager->fd 
1f770 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  =   (sqlite3_fil
1f780 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
1f790 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b  D8(pcacheSize));
1f7a0 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20  .  pPager->sjfd 
1f7b0 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  = (sqlite3_file*
1f7c0 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
1f7d0 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29  (pVfs->szOsFile)
1f7e0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64  );.  pPager->jfd
1f7f0 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c   =  (sqlite3_fil
1f800 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72  e*)(pPtr += jour
1f810 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20  nalFileSize);.  
1f820 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
1f830 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70  e =    (char*)(p
1f840 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69  Ptr += journalFi
1f850 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72  leSize);.  asser
1f860 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
1f870 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e  IGNMENT(pPager->
1f880 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  jfd) );..  /* Fi
1f890 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  ll in the Pager.
1f8a0 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61  zFilename and Pa
1f8b0 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66  ger.zJournal buf
1f8c0 66 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65  fers, if require
1f8d0 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74  d. */.  if( zPat
1f8e0 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 70 50 61  hname ){.    pPa
1f8f0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20  ger->zJournal = 
1f900 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b    (char*)(pPtr +
1f910 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 29  = nPathname + 1)
1f920 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  ;.    memcpy(pPa
1f930 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
1f940 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
1f950 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70  name);.    memcp
1f960 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
1f970 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  al, zPathname, n
1f980 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d  Pathname);.    m
1f990 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  emcpy(&pPager->z
1f9a0 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d  Journal[nPathnam
1f9b0 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20  e], "-journal", 
1f9c0 38 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  8);.    sqlite3_
1f9d0 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b  free(zPathname);
1f9e0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70  .  }.  pPager->p
1f9f0 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50  Vfs = pVfs;.  pP
1fa00 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d  ager->vfsFlags =
1fa10 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a   vfsFlags;..  /*
1fa20 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20   Open the pager 
1fa30 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
1fa40 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
1fa50 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21 6d  ilename[0] && !m
1fa60 65 6d 44 62 20 29 7b 0a 20 20 20 20 69 6e 74 20  emDb ){.    int 
1fa70 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20  fout = 0;       
1fa80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fa90 56 46 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e  VFS flags return
1faa0 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f  ed by xOpen() */
1fab0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1fac0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
1fad0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
1fae0 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73   pPager->fd, vfs
1faf0 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20  Flags, &fout);. 
1fb00 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66     readOnly = (f
1fb10 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  out&SQLITE_OPEN_
1fb20 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20  READONLY);..    
1fb30 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77  /* If the file w
1fb40 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
1fb50 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f  opened for read/
1fb60 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20  write access,.  
1fb70 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65    ** choose a de
1fb80 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
1fb90 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20  in case we have 
1fba0 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20  to create the.  
1fbb0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
1fbc0 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20  le. The default 
1fbd0 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65  page size is the
1fbe0 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20   maximum of:.   
1fbf0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20   **.    **    + 
1fc00 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
1fc10 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a  AGE_SIZE,.    **
1fc20 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20      + The value 
1fc30 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
1fc40 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
1fc50 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68  ).    **    + Th
1fc60 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73  e largest page s
1fc70 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  ize that can be 
1fc80 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c  written atomical
1fc90 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ly..    */.    i
1fca0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1fcb0 20 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b   && !readOnly ){
1fcc0 0a 20 20 20 20 20 20 73 65 74 53 65 63 74 6f 72  .      setSector
1fcd0 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
1fce0 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
1fcf0 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
1fd00 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  IZE<=SQLITE_MAX_
1fd10 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
1fd20 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  E);.      if( sz
1fd30 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72 2d  PageDflt<pPager-
1fd40 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20  >sectorSize ){. 
1fd50 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
1fd60 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51  r->sectorSize>SQ
1fd70 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
1fd80 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20  _PAGE_SIZE ){.  
1fd90 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
1fda0 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  lt = SQLITE_MAX_
1fdb0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
1fdc0 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  E;.        }else
1fdd0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61  {.          szPa
1fde0 67 65 44 66 6c 74 20 3d 20 28 75 31 36 29 70 50  geDflt = (u16)pP
1fdf0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
1fe00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1fe10 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
1fe20 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
1fe30 57 52 49 54 45 0a 20 20 20 20 20 20 7b 0a 20 20  WRITE.      {.  
1fe40 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20        int iDc = 
1fe50 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
1fe60 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
1fe70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
1fe80 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
1fe90 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
1fea0 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
1feb0 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20  2==(512>>8));.  
1fec0 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
1fed0 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
1fee0 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29  64K==(65536>>8))
1fef0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1ff00 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  (SQLITE_MAX_DEFA
1ff10 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36  ULT_PAGE_SIZE<=6
1ff20 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 66  5536);.        f
1ff30 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74  or(ii=szPageDflt
1ff40 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  ; ii<=SQLITE_MAX
1ff50 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
1ff60 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20  ZE; ii=ii*2){.  
1ff70 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26          if( iDc&
1ff80 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
1ff90 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b  OMIC|(ii>>8)) ){
1ffa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50  .            szP
1ffb0 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20  ageDflt = ii;.  
1ffc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ffd0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
1ffe0 69 66 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  if.    }.  }else
1fff0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74 65  {.    /* If a te
20000 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
20010 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73  requested, it is
20020 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65   not opened imme
20030 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20  diately..    ** 
20040 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20  In this case we 
20050 61 63 63 65 70 74 20 74 68 65 20 64 65 66 61 75  accept the defau
20060 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64  lt page size and
20070 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a   delay actually.
20080 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74      ** opening t
20090 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68  he file until th
200a0 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
200b0 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20 2a  OsWrite()..    *
200c0 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72  *.    ** This br
200d0 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75 6e  anch is also run
200e0 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
200f0 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20 69  y database. An i
20100 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20  n-memory.    ** 
20110 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65 20  database is the 
20120 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d 66  same as a temp-f
20130 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76 65  ile that is neve
20140 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  r written out to
20150 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64  .    ** disk and
20160 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f   uses an in-memo
20170 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ry rollback jour
20180 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20  nal..    */ .   
20190 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20   tempFile = 1;. 
201a0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
201b0 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
201c0 56 45 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79  VE;.    readOnly
201d0 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c   = (vfsFlags&SQL
201e0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
201f0 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  Y);.  }..  /* Th
20200 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c  e following call
20210 20 74 6f 20 50 61 67 65 72 53 65 74 50 61 67 65   to PagerSetPage
20220 73 69 7a 65 28 29 20 73 65 72 76 65 73 20 74 6f  size() serves to
20230 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   set the value o
20240 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70 61  f .  ** Pager.pa
20250 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c  geSize and to al
20260 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65 72  locate the Pager
20270 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65  .pTmpSpace buffe
20280 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  r..  */.  if( rc
20290 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
202a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
202b0 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20  r->memDb==0 );. 
202c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
202d0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
202e0 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65 44  pPager, &szPageD
202f0 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65  flt, -1);.    te
20300 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
20310 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20  TE_OK );.  }..  
20320 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
20330 63 63 75 72 72 65 64 20 69 6e 20 65 69 74 68 65  ccurred in eithe
20340 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20  r of the blocks 
20350 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20  above, free the 
20360 0a 20 20 2a 2a 20 50 61 67 65 72 20 73 74 72 75  .  ** Pager stru
20370 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20  cture and close 
20380 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  the file..  */. 
20390 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
203a0 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
203b0 28 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  ( !pPager->pTmpS
203c0 70 61 63 65 20 29 3b 0a 20 20 20 20 73 71 6c 69  pace );.    sqli
203d0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
203e0 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69  r->fd);.    sqli
203f0 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29  te3_free(pPager)
20400 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
20410 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
20420 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68 65  alize the PCache
20430 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 61 73   object. */.  as
20440 73 65 72 74 28 20 6e 45 78 74 72 61 3c 31 30 30  sert( nExtra<100
20450 30 20 29 3b 0a 20 20 6e 45 78 74 72 61 20 3d 20  0 );.  nExtra = 
20460 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a  ROUND8(nExtra);.
20470 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f    sqlite3PcacheO
20480 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20  pen(szPageDflt, 
20490 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a  nExtra, !memDb,.
204a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204b0 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72      !memDb?pager
204c0 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20  Stress:0, (void 
204d0 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  *)pPager, pPager
204e0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 50  ->pPCache);..  P
204f0 41 47 45 52 54 52 41 43 45 28 28 22 4f 50 45 4e  AGERTRACE(("OPEN
20500 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48   %d %s\n", FILEH
20510 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e  ANDLEID(pPager->
20520 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  fd), pPager->zFi
20530 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52  lename));.  IOTR
20540 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73  ACE(("OPEN %p %s
20550 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
20560 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29  ger->zFilename))
20570 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  ..  pPager->useJ
20580 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65  ournal = (u8)use
20590 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65  Journal;.  pPage
205a0 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20  r->noReadlock = 
205b0 28 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72  (noReadlock && r
205c0 65 61 64 4f 6e 6c 79 29 20 3f 31 3a 30 3b 0a 20  eadOnly) ?1:0;. 
205d0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
205e0 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Open = 0; */.  /
205f0 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  * pPager->stmtIn
20600 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  Use = 0; */.  /*
20610 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20   pPager->nRef = 
20620 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
20630 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 28 75  dbSizeValid = (u
20640 38 29 6d 65 6d 44 62 3b 0a 20 20 2f 2a 20 70 50  8)memDb;.  /* pP
20650 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
20660 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
20670 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
20680 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
20690 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f  r->nPage = 0; */
206a0 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  .  pPager->mxPgn
206b0 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50  o = SQLITE_MAX_P
206c0 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20  AGE_COUNT;.  /* 
206d0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
206e0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f  PAGER_UNLOCK; */
206f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20700 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74 65 6d  r->state == (tem
20710 70 46 69 6c 65 20 3f 20 50 41 47 45 52 5f 45 58  pFile ? PAGER_EX
20720 43 4c 55 53 49 56 45 20 3a 20 50 41 47 45 52 5f  CLUSIVE : PAGER_
20730 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f 2a 20  UNLOCK) );.  /* 
20740 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
20750 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
20760 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38  ->tempFile = (u8
20770 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73  )tempFile;.  ass
20780 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50  ert( tempFile==P
20790 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
207a0 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20  _NORMAL .       
207b0 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d     || tempFile==
207c0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
207d0 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  E_EXCLUSIVE );. 
207e0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
207f0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
20800 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61  SIVE==1 );.  pPa
20810 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
20820 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c  de = (u8)tempFil
20830 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63 68  e; .  pPager->ch
20840 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
20850 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
20860 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  ;.  pPager->memD
20870 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20  b = (u8)memDb;. 
20880 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
20890 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79  y = (u8)readOnly
208a0 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  ;.  /* pPager->n
208b0 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a  eedSync = 0; */.
208c0 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
208d0 20 3d 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70   = (pPager->temp
208e0 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72  File || !useJour
208f0 6e 61 6c 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61  nal) ?1:0;.  pPa
20900 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
20910 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f  pPager->noSync ?
20920 30 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  0:1;.  pPager->s
20930 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49  ync_flags = SQLI
20940 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
20950 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
20960 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  rst = 0; */.  /*
20970 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
20980 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20  ynced = 0; */.  
20990 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  /* pPager->pLast
209a0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
209b0 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36  r->nExtra = (u16
209c0 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65  )nExtra;.  pPage
209d0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
209e0 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  mit = SQLITE_DEF
209f0 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a  AULT_JOURNAL_SIZ
20a00 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72  E_LIMIT;.  asser
20a10 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
20a20 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c  ->fd) || tempFil
20a30 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72  e );.  setSector
20a40 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
20a50 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20  if( memDb ){.   
20a60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20a70 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
20a80 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b  RNALMODE_MEMORY;
20a90 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72  .  }.  /* pPager
20aa0 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->xBusyHandler =
20ab0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
20ac0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
20ad0 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  Arg = 0; */.  /*
20ae0 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
20af0 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66  aHash, 0, sizeof
20b00 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29  (pPager->aHash))
20b10 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20  ; */.  *ppPager 
20b20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  = pPager;.  retu
20b30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
20b40 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
20b50 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
20b60 20 61 66 74 65 72 20 74 72 61 6e 73 69 74 69 6f   after transitio
20b70 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52 5f  ning from PAGER_
20b80 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47  UNLOCK to.** PAG
20b90 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 2e  ER_SHARED state.
20ba0 20 49 74 20 74 65 73 74 73 20 69 66 20 74 68 65   It tests if the
20bb0 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72  re is a hot jour
20bc0 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a  nal present in.*
20bd0 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  * the file-syste
20be0 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  m for the given 
20bf0 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75  pager. A hot jou
20c00 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74  rnal is one that
20c10 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65   .** needs to be
20c20 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41 63   played back. Ac
20c30 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20  cording to this 
20c40 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d  function, a hot-
20c50 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
20c60 65 78 69 73 74 73 20 69 66 20 74 68 65 20 66 6f  exists if the fo
20c70 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61  llowing criteria
20c80 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20   are met:.**.** 
20c90 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20    * The journal 
20ca0 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20 74  file exists in t
20cb0 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20  he file system, 
20cc0 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72  and.**   * No pr
20cd0 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45  ocess holds a RE
20ce0 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65  SERVED or greate
20cf0 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  r lock on the da
20d00 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64  tabase file, and
20d10 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61  .**   * The data
20d20 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66  base file itself
20d30 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
20d40 20 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   0 bytes in size
20d50 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
20d60 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
20d70 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
20d80 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f  exists and is no
20d90 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66  t 0x00..**.** If
20da0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
20db0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
20dc0 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20  e file is 0 but 
20dd0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  a journal file.*
20de0 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69  * exists, that i
20df0 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c  s probably an ol
20e00 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f  d journal left o
20e10 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  ver from a prior
20e20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74  .** database wit
20e30 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
20e40 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
20e50 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
20e60 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74 65  s.** just delete
20e70 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74 65  d using OsDelete
20e80 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65  , *pExists is se
20e90 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
20ea0 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
20eb0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ned..**.** This 
20ec0 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
20ed0 20 63 68 65 63 6b 20 69 66 20 74 68 65 72 65 20   check if there 
20ee0 69 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  is a master jour
20ef0 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20  nal filename.** 
20f00 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
20f10 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
20f20 20 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d 61   is, and that ma
20f30 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
20f40 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78  e.** does not ex
20f50 69 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ist, then the jo
20f60 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
20f70 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e  t really hot. In
20f80 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74 68   this.** case th
20f90 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
20fa0 72 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d 70  return a false-p
20fb0 6f 73 69 74 69 76 65 2e 20 54 68 65 20 70 61 67  ositive. The pag
20fc0 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a  er_playback().**
20fd0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69   routine will di
20fe0 73 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 20  scover that the 
20ff0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
21000 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61  not really hot a
21010 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  nd .** will not 
21020 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a  roll it back. .*
21030 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f  *.** If a hot-jo
21040 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 6f  urnal file is fo
21050 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a 70  und to exist, *p
21060 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f  Exists is set to
21070 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54   1 and .** SQLIT
21080 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
21090 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  f no hot-journal
210a0 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74   file is present
210b0 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a 2a  , *pExists is.**
210c0 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
210d0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
210e0 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
210f0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
21100 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72  ying.** to deter
21110 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
21120 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  not a hot-journa
21130 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74  l file exists, t
21140 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63  he IO error.** c
21150 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
21160 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  and the value of
21170 20 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e 64   *pExists is und
21180 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
21190 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72  c int hasHotJour
211a0 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
211b0 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29  r, int *pExists)
211c0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
211d0 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
211e0 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
211f0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
21200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21210 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
21220 20 69 6e 74 20 65 78 69 73 74 73 3b 20 20 20 20   int exists;    
21230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21240 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75 72  * True if a jour
21250 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73  nal file is pres
21260 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ent */..  assert
21270 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
21280 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21290 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
212a0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
212b0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
212c0 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
212d0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
212e0 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30  ..  *pExists = 0
212f0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
21300 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70  OsAccess(pVfs, p
21310 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
21320 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
21330 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b  XISTS, &exists);
21340 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
21350 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29  E_OK && exists )
21360 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64  {.    int locked
21370 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21380 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d    /* True if som
21390 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  e process holds 
213a0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
213b0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20  */..    /* Race 
213c0 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20  condition here: 
213d0 20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   Another process
213e0 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e   might have been
213f0 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20   holding the.   
21400 20 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45 44   ** the RESERVED
21410 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61   lock and have a
21420 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74   journal open at
21430 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63   the sqlite3OsAc
21440 63 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63  cess() .    ** c
21450 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74  all above, but t
21460 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a  hen delete the j
21470 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20  ournal and drop 
21480 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a  the lock before.
21490 20 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f      ** we get to
214a0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
214b0 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
214c0 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
214d0 2e 20 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a  .  If that.    *
214e0 2a 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  * is the case, t
214f0 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
21500 74 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73  t think there is
21510 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77   a hot journal w
21520 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61  hen.    ** in fa
21530 63 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65  ct there is none
21540 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74 73 20  .  This results 
21550 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74  in a false-posit
21560 69 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20  ive which will. 
21570 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77     ** be dealt w
21580 69 74 68 20 62 79 20 74 68 65 20 70 6c 61 79 62  ith by the playb
21590 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69  ack routine.  Ti
215a0 63 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20  cket #3883..    
215b0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
215c0 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
215d0 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  edLock(pPager->f
215e0 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20  d, &locked);.   
215f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21600 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b  OK && !locked ){
21610 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65  .      int nPage
21620 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  ;..      /* Chec
21630 6b 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  k the size of th
21640 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
21650 20 49 66 20 69 74 20 63 6f 6e 73 69 73 74 73 20   If it consists 
21660 6f 66 20 30 20 70 61 67 65 73 2c 0a 20 20 20 20  of 0 pages,.    
21670 20 20 2a 2a 20 74 68 65 6e 20 64 65 6c 65 74 65    ** then delete
21680 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
21690 65 2e 20 53 65 65 20 74 68 65 20 68 65 61 64 65  e. See the heade
216a0 72 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20  r comment above 
216b0 66 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  for .      ** th
216c0 65 20 72 65 61 73 6f 6e 69 6e 67 20 68 65 72 65  e reasoning here
216d0 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 6f 62  .  Delete the ob
216e0 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66  solete journal f
216f0 69 6c 65 20 75 6e 64 65 72 0a 20 20 20 20 20 20  ile under.      
21700 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  ** a RESERVED lo
21710 63 6b 20 74 6f 20 61 76 6f 69 64 20 72 61 63 65  ck to avoid race
21720 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20   conditions and 
21730 74 6f 20 61 76 6f 69 64 20 76 69 6f 6c 61 74 69  to avoid violati
21740 6e 67 0a 20 20 20 20 20 20 2a 2a 20 5b 48 33 33  ng.      ** [H33
21750 30 32 30 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  020]..      */. 
21760 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
21770 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
21780 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
21790 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
217a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
217b0 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
217c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
217d0 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
217e0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
217f0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
21800 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
21810 45 52 56 45 44 0a 20 20 20 20 20 20 20 20 20 20  ERVED.          
21820 20 20 20 20 20 20 20 7c 7c 20 20 73 71 6c 69 74         ||  sqlit
21830 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
21840 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  >fd, RESERVED_LO
21850 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  CK)==SQLITE_OK )
21860 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
21870 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
21880 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
21890 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  rnal, 0);.      
218a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
218b0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
218c0 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20  ER_SHARED );.   
218d0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61           if( pPa
218e0 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
218f0 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20  R_SHARED ){.    
21900 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
21910 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72  3OsUnlock(pPager
21920 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
21930 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  K);.            
21940 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
21950 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
21960 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
21970 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
21980 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
21990 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
219a0 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  xists and no oth
219b0 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
219c0 73 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20  s a reserved.   
219d0 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65         ** or gre
219e0 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
219f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
21a00 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74  Now check that t
21a10 68 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20  here is.        
21a20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e    ** at least on
21a30 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73  e non-zero bytes
21a40 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
21a50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
21a60 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e..          ** 
21a70 49 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65  If there is, the
21a80 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68  n we consider th
21a90 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65  is journal to be
21aa0 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20   hot. If not, . 
21ab0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63           ** it c
21ac0 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20  an be ignored.. 
21ad0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
21ae0 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51        int f = SQ
21af0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
21b00 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
21b10 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20  AIN_JOURNAL;.   
21b20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
21b30 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
21b40 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
21b50 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
21b60 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20  , &f);.         
21b70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21b80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
21b90 20 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a    u8 first = 0;.
21ba0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
21bb0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
21bc0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69  Pager->jfd, (voi
21bd0 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30  d *)&first, 1, 0
21be0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
21bf0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
21c00 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
21c10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
21c20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
21c30 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
21c40 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
21c50 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
21c60 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  >jfd);.         
21c70 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66     *pExists = (f
21c80 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20  irst!=0);.      
21c90 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
21ca0 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  ==SQLITE_CANTOPE
21cb0 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
21cc0 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74   /* If we cannot
21cd0 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   open the rollba
21ce0 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ck journal file 
21cf0 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20  in order to see 
21d00 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  if.            *
21d10 2a 20 69 74 73 20 68 61 73 20 61 20 7a 65 72 6f  * its has a zero
21d20 20 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69   header, that mi
21d30 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e  ght be due to an
21d40 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20   I/O error, or. 
21d50 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
21d60 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
21d70 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74   the race condit
21d80 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62  ion described ab
21d90 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20  ove and in.     
21da0 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74         ** ticket
21db0 20 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20   #3883.  Either 
21dc0 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74  way, assume that
21dd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
21de0 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20  hot..           
21df0 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62   ** This might b
21e00 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69  e a false positi
21e10 76 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69  ve.  But if it i
21e20 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  s, then the.    
21e30 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d          ** autom
21e40 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61  atic journal pla
21e50 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65  yback and recove
21e60 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c  ry mechanism wil
21e70 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20  l deal.         
21e80 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e     ** with it un
21e90 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45  der an EXCLUSIVE
21ea0 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64   lock where we d
21eb0 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20  o not need to.  
21ec0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72            ** wor
21ed0 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20  ry so much with 
21ee0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e  race conditions.
21ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
21f00 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78              *pEx
21f10 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  ists = 1;.      
21f20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
21f30 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
21f40 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
21f50 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
21f60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21f70 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f  *.** Read the co
21f80 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70  ntent for page p
21f90 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61  Pg out of the da
21fa0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
21fb0 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44  into .** pPg->pD
21fc0 61 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f  ata. A shared lo
21fd0 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75  ck or greater mu
21fe0 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  st be held on th
21ff0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
22000 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  le before this f
22010 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
22020 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65  d..**.** If page
22030 20 31 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e   1 is read, then
22040 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
22050 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d  ger.dbFileVers[]
22060 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68   is set to.** th
22070 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
22080 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
22090 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ile..**.** If an
220a0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
220b0 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
220c0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
220d0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
220e0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  * Otherwise, SQL
220f0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
22100 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
22110 74 20 72 65 61 64 44 62 50 61 67 65 28 50 67 48  t readDbPage(PgH
22120 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
22130 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
22140 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65  >pPager; /* Page
22150 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61  r object associa
22160 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70 50  ted with page pP
22170 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  g */.  Pgno pgno
22180 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20   = pPg->pgno;   
22190 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
221a0 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20  er to read */.  
221b0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
221c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
221d0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
221e0 20 69 36 34 20 69 4f 66 66 73 65 74 3b 20 20 20   i64 iOffset;   
221f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22200 20 42 79 74 65 20 6f 66 66 73 65 74 20 6f 66 20   Byte offset of 
22210 66 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f  file to read fro
22220 6d 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  m */..  assert( 
22230 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
22240 41 47 45 52 5f 53 48 41 52 45 44 20 26 26 20 21  AGER_SHARED && !
22250 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28 20  MEMDB );..  if( 
22260 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
22270 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
22280 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
22290 69 6c 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65  ile );.    memse
222a0 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c  t(pPg->pData, 0,
222b0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
222c0 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
222d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
222e0 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d  iOffset = (pgno-
222f0 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
22300 70 61 67 65 53 69 7a 65 3b 0a 20 20 72 63 20 3d  pageSize;.  rc =
22310 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
22320 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e  Pager->fd, pPg->
22330 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
22340 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 73 65 74  ageSize, iOffset
22350 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
22360 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
22370 52 45 41 44 20 29 7b 0a 20 20 20 20 72 63 20 3d  READ ){.    rc =
22380 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
22390 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
223a0 0a 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56  .    u8 *dbFileV
223b0 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67  ers = &((u8*)pPg
223c0 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20  ->pData)[24];.  
223d0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
223e0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
223f0 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
22400 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
22410 65 72 73 29 29 3b 0a 20 20 7d 0a 20 20 43 4f 44  ers));.  }.  COD
22420 45 43 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d  EC1(pPager, pPg-
22430 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c  >pData, pgno, 3,
22440 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
22450 45 4d 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e  EM);..  PAGER_IN
22460 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
22470 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a  _readdb_count);.
22480 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
22490 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49  ger->nRead);.  I
224a0 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70  OTRACE(("PGIN %p
224b0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
224c0 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54  pgno));.  PAGERT
224d0 52 41 43 45 28 28 22 46 45 54 43 48 20 25 64 20  RACE(("FETCH %d 
224e0 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
224f0 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
22500 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
22510 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67  ager), pgno, pag
22520 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
22530 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  ));..  return rc
22540 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
22550 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
22560 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ed whenever the 
22570 75 70 70 65 72 20 6c 61 79 65 72 20 72 65 71 75  upper layer requ
22580 65 73 74 73 20 61 20 64 61 74 61 62 61 73 65 0a  ests a database.
22590 2a 2a 20 70 61 67 65 20 69 73 20 72 65 71 75 65  ** page is reque
225a0 73 74 65 64 2c 20 62 65 66 6f 72 65 20 74 68 65  sted, before the
225b0 20 63 61 63 68 65 20 69 73 20 63 68 65 63 6b 65   cache is checke
225c0 64 20 66 6f 72 20 61 20 73 75 69 74 61 62 6c 65  d for a suitable
225d0 20 70 61 67 65 0a 2a 2a 20 6f 72 20 61 6e 79 20   page.** or any 
225e0 64 61 74 61 20 69 73 20 72 65 61 64 20 66 72 6f  data is read fro
225f0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
22600 49 74 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20  It performs the 
22610 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 77 6f  following.** two
22620 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a   functions:.**.*
22630 2a 20 20 20 31 29 20 49 66 20 74 68 65 20 70 61  *   1) If the pa
22640 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ger is currently
22650 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   in PAGER_UNLOCK
22660 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20   state (no lock 
22670 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20  held.**      on 
22680 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22690 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65  e), then an atte
226a0 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f  mpt is made to o
226b0 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20  btain a.**      
226c0 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
226d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
226e0 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  . Immediately af
226f0 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a  ter obtaining.**
22700 20 20 20 20 20 20 74 68 65 20 53 48 41 52 45 44        the SHARED
22710 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d   lock, the file-
22720 73 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65  system is checke
22730 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  d for a hot-jour
22740 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69  nal,.**      whi
22750 63 68 20 69 73 20 70 6c 61 79 65 64 20 62 61 63  ch is played bac
22760 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f  k if present. Fo
22770 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d  llowing any hot-
22780 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20  journal .**     
22790 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63   rollback, the c
227a0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63  ontents of the c
227b0 61 63 68 65 20 61 72 65 20 76 61 6c 69 64 61 74  ache are validat
227c0 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a  ed by checking.*
227d0 2a 20 20 20 20 20 20 74 68 65 20 27 63 68 61 6e  *      the 'chan
227e0 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c  ge-counter' fiel
227f0 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
22800 65 20 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e  e file header an
22810 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72  d.**      discar
22820 64 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20  ded if they are 
22830 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61  found to be inva
22840 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  lid..**.**   2) 
22850 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
22860 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
22870 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74  sive-mode, and t
22880 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74  here are current
22890 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75  ly.**      no ou
228a0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
228b0 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65  nces to any page
228c0 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65  s, and is in the
228d0 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a   error state,.**
228e0 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74        then an at
228f0 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
22900 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72   clear the error
22910 20 73 74 61 74 65 20 62 79 20 64 69 73 63 61 72   state by discar
22920 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  ding.**      the
22930 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
22940 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
22950 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79  rolling back any
22960 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   open journal.**
22970 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a        file..**.*
22980 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69  * If the operati
22990 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20  on described by 
229a0 28 32 29 20 61 62 6f 76 65 20 69 73 20 6e 6f 74  (2) above is not
229b0 20 61 74 74 65 6d 70 74 65 64 2c 20 61 6e 64 20   attempted, and 
229c0 69 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 72 20  if the.** pager 
229d0 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73  is in an error s
229e0 74 61 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20  tate other than 
229f0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 77 68 65 6e  SQLITE_FULL when
22a00 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
22a10 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 73 74  .** the error st
22a20 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
22a30 73 20 72 65 74 75 72 6e 65 64 2e 20 49 74 20 69  s returned. It i
22a40 73 20 70 65 72 6d 69 74 74 65 64 20 74 6f 20 72  s permitted to r
22a50 65 61 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ead the.** datab
22a60 61 73 65 20 77 68 65 6e 20 69 6e 20 53 51 4c 49  ase when in SQLI
22a70 54 45 5f 46 55 4c 4c 20 65 72 72 6f 72 20 73 74  TE_FULL error st
22a80 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ate..**.** Other
22a90 77 69 73 65 2c 20 69 66 20 65 76 65 72 79 74 68  wise, if everyth
22aa0 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
22ab0 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
22ac0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 0a  returned. If an.
22ad0 2a 2a 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  ** IO error occu
22ae0 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67  rs while locking
22af0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 63   the database, c
22b00 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f  hecking for a ho
22b10 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  t-journal.** fil
22b20 65 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63  e or rolling bac
22b30 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  k a journal file
22b40 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  , the IO error c
22b50 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
22b60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
22b70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50  agerSharedLock(P
22b80 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
22b90 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
22ba0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
22bb0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
22bc0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 72  de */.  int isEr
22bd0 72 6f 72 52 65 73 65 74 20 3d 20 30 3b 20 20 20  rorReset = 0;   
22be0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
22bf0 75 65 20 69 66 20 72 65 63 6f 76 65 72 69 6e 67  ue if recovering
22c00 20 66 72 6f 6d 20 65 72 72 6f 72 20 73 74 61 74   from error stat
22c10 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68  e */..  /* If th
22c20 69 73 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  is database is o
22c30 70 65 6e 65 64 20 66 6f 72 20 65 78 63 6c 75 73  pened for exclus
22c40 69 76 65 20 61 63 63 65 73 73 2c 20 68 61 73 20  ive access, has 
22c50 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a  no outstanding .
22c60 20 20 2a 2a 20 70 61 67 65 20 72 65 66 65 72 65    ** page refere
22c70 6e 63 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61  nces and is in a
22c80 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 74  n error-state, t
22c90 68 69 73 20 69 73 20 61 20 63 68 61 6e 63 65 20  his is a chance 
22ca0 74 6f 20 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68  to clear.  ** th
22cb0 65 20 65 72 72 6f 72 2e 20 44 69 73 63 61 72 64  e error. Discard
22cc0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
22cd0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
22ce0 20 61 6e 64 20 74 72 65 61 74 20 61 6e 79 0a 20   and treat any. 
22cf0 20 2a 2a 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c   ** open journal
22d00 20 66 69 6c 65 20 61 73 20 61 20 68 6f 74 2d 6a   file as a hot-j
22d10 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69  ournal..  */.  i
22d20 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61  f( !MEMDB && pPa
22d30 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
22d40 64 65 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65  de .   && sqlite
22d50 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
22d60 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
22d70 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ==0 && pPager->e
22d80 72 72 43 6f 64 65 20 0a 20 20 29 7b 0a 20 20 20  rrCode .  ){.   
22d90 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
22da0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
22db0 20 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 3d    isErrorReset =
22dc0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   1;.    }.    pP
22dd0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
22de0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 70  SQLITE_OK;.    p
22df0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
22e00 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r);.  }..  /* If
22e10 20 74 68 65 20 70 61 67 65 72 20 69 73 20 73 74   the pager is st
22e20 69 6c 6c 20 69 6e 20 61 6e 20 65 72 72 6f 72 20  ill in an error 
22e30 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 70 72  state, do not pr
22e40 6f 63 65 65 64 2e 20 54 68 65 20 65 72 72 6f 72  oceed. The error
22e50 20 0a 20 20 2a 2a 20 73 74 61 74 65 20 77 69 6c   .  ** state wil
22e60 6c 20 62 65 20 63 6c 65 61 72 65 64 20 61 74 20  l be cleared at 
22e70 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
22e80 65 20 66 75 74 75 72 65 20 77 68 65 6e 20 61 6c  e future when al
22e90 6c 20 70 61 67 65 20 0a 20 20 2a 2a 20 72 65 66  l page .  ** ref
22ea0 65 72 65 6e 63 65 73 20 61 72 65 20 64 72 6f 70  erences are drop
22eb0 70 65 64 20 61 6e 64 20 74 68 65 20 63 61 63 68  ped and the cach
22ec0 65 20 63 61 6e 20 62 65 20 64 69 73 63 61 72 64  e can be discard
22ed0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
22ee0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
22ef0 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
22f00 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  e!=SQLITE_FULL )
22f10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  {.    return pPa
22f20 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
22f30 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
22f40 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
22f50 4c 4f 43 4b 20 7c 7c 20 69 73 45 72 72 6f 72 52  LOCK || isErrorR
22f60 65 73 65 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  eset ){.    sqli
22f70 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
22f80 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
22f90 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 69 73 48  Vfs;.    int isH
22fa0 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  otJournal = 0;. 
22fb0 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
22fc0 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  B );.    assert(
22fd0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
22fe0 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
22ff0 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20  PCache)==0 );.  
23000 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
23010 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20  oReadlock ){.   
23020 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
23030 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
23040 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
23050 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
23060 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23070 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
23080 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
23090 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  _UNLOCK );.     
230a0 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
230b0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
230c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
230d0 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
230e0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
230f0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
23100 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
23110 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
23120 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
23130 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41  ager->state>=SHA
23140 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 20  RED_LOCK );..   
23150 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
23160 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
23170 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
23180 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
23190 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
231a0 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  se file, then it
231b0 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f   either needs to
231c0 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
231d0 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  or deleted..    
231e0 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73 45 72  */.    if( !isEr
231f0 72 6f 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  rorReset ){.    
23200 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75    rc = hasHotJou
23210 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 69 73  rnal(pPager, &is
23220 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  HotJournal);.   
23230 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
23240 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
23250 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
23260 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
23270 66 28 20 69 73 45 72 72 6f 72 52 65 73 65 74 20  f( isErrorReset 
23280 7c 7c 20 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20  || isHotJournal 
23290 29 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20  ){.      /* Get 
232a0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
232b0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
232c0 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20  e file. At this 
232d0 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20  point it is.    
232e0 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74    ** important t
232f0 68 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  hat a RESERVED l
23300 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69  ock is not obtai
23310 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74  ned on the way t
23320 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45  o the.      ** E
23330 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
23340 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68  f it were, anoth
23350 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
23360 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20   open the.      
23370 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
23380 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53  , detect the RES
23390 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20  ERVED lock, and 
233a0 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68  conclude that th
233b0 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  e.      ** datab
233c0 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72  ase is safe to r
233d0 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70  ead while this p
233e0 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
233f0 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20  rolling the .   
23400 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61     ** hot-journa
23410 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a  l back..      **
23420 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75   .      ** Becau
23430 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69  se the intermedi
23440 61 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  ate RESERVED loc
23450 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74  k is not request
23460 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a  ed, any.      **
23470 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 61   other process a
23480 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63  ttempting to acc
23490 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
234a0 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74   file will get t
234b0 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  o .      ** this
234c0 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f   point in the co
234d0 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f  de and fail to o
234e0 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58  btain its own EX
234f0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20  CLUSIVE lock .  
23500 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61      ** on the da
23510 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
23520 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
23530 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 45 58  pPager->state<EX
23540 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
23550 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
23560 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
23570 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45  r->fd, EXCLUSIVE
23580 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
23590 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
235a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
235b0 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28  c = pager_error(
235c0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
235d0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
235e0 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ed;.        }.  
235f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
23600 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
23610 55 53 49 56 45 3b 0a 20 20 20 20 20 20 7d 0a 20  USIVE;.      }. 
23620 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74  .      /* Open t
23630 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
23640 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
23650 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
23660 65 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 65  e in .      ** e
23670 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
23680 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64 65  mode the file de
23690 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65  scriptor will be
236a0 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 0a 20   kept open and. 
236b0 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 79       ** possibly
236c0 20 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e   used for a tran
236d0 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e  saction later on
236e0 2e 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  . On some system
236f0 73 2c 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  s, the.      ** 
23700 4f 73 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c  OsTruncate() cal
23710 6c 20 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73  l used in exclus
23720 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
23730 61 6c 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20  also requires.  
23740 20 20 20 20 2a 2a 20 61 20 72 65 61 64 2f 77 72      ** a read/wr
23750 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e  ite file handle.
23760 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
23770 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
23780 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
23790 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20      int res;.   
237a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
237b0 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 70  3OsAccess(pVfs,p
237c0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
237d0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
237e0 49 53 54 53 2c 26 72 65 73 29 3b 0a 20 20 20 20  ISTS,&res);.    
237f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
23800 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
23810 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20     if( res ){.  
23820 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f            int fo
23830 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ut = 0;.        
23840 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49      int f = SQLI
23850 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
23860 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  E|SQLITE_OPEN_MA
23870 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20  IN_JOURNAL;.    
23880 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
23890 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
238a0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e );.           
238b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
238c0 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
238d0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
238e0 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75  er->jfd, f, &fou
238f0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
23900 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
23910 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
23920 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
23930 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
23940 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
23950 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45   fout&SQLITE_OPE
23960 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20  N_READONLY ){.  
23970 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
23980 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
23990 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
239a0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
239b0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
239c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
239d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
239e0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
239f0 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e  e journal does n
23a00 6f 74 20 65 78 69 73 74 2c 20 74 68 61 74 20 6d  ot exist, that m
23a10 65 61 6e 73 20 73 6f 6d 65 20 6f 74 68 65 72 20  eans some other 
23a20 70 72 6f 63 65 73 73 0a 20 20 20 20 20 20 20 20  process.        
23a30 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61      ** has alrea
23a40 64 79 20 72 6f 6c 6c 65 64 20 69 74 20 62 61 63  dy rolled it bac
23a50 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  k */.           
23a60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
23a70 59 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  Y;.          }. 
23a80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23a90 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
23aa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23ab0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
23ac0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
23ad0 2f 2a 20 54 4f 44 4f 3a 20 57 68 79 20 61 72 65  /* TODO: Why are
23ae0 20 74 68 65 73 65 20 63 6c 65 61 72 65 64 20 68   these cleared h
23af0 65 72 65 3f 20 49 73 20 69 74 20 6e 65 63 65 73  ere? Is it neces
23b00 73 61 72 79 3f 20 2a 2f 0a 20 20 20 20 20 20 70  sary? */.      p
23b10 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
23b20 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  arted = 0;.     
23b30 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
23b40 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Off = 0;.      p
23b50 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
23b60 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
23b70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
23b80 20 30 3b 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50   0;. .      /* P
23b90 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65  layback and dele
23ba0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  te the journal. 
23bb0 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61   Drop the databa
23bc0 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a  se write.      *
23bd0 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71  * lock and reacq
23be0 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
23bf0 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63 61  ck. Purge the ca
23c00 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20  che before.     
23c10 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   ** playing back
23c20 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c   the hot-journal
23c30 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27   so that we don'
23c40 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20  t end up with.  
23c50 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73      ** an incons
23c60 69 73 74 65 6e 74 20 63 61 63 68 65 2e 0a 20 20  istent cache..  
23c70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
23c80 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
23c90 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
23ca0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
23cb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
23cc0 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72  rc = pager_error
23cd0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
23ce0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
23cf0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
23d00 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
23d10 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
23d20 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 20 20  HARED).         
23d30 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78    || (pPager->ex
23d40 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70  clusiveMode && p
23d50 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 50 41 47  Pager->state>PAG
23d60 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20  ER_SHARED).     
23d70 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   );.    }..    i
23d80 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  f( pPager->pBack
23d90 75 70 20 7c 7c 20 73 71 6c 69 74 65 33 50 63 61  up || sqlite3Pca
23da0 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61  chePagecount(pPa
23db0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20  ger->pPCache)>0 
23dc0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
23dd0 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20  shared-lock has 
23de0 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72  just been acquir
23df0 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
23e00 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  se file.      **
23e10 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61   and there are a
23e20 6c 72 65 61 64 79 20 70 61 67 65 73 20 69 6e 20  lready pages in 
23e30 74 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20  the cache (from 
23e40 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20  a previous.     
23e50 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74   ** read or writ
23e60 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20  e transaction). 
23e70 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
23e80 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
23e90 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20      ** has been 
23ea0 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74 68  modified.  If th
23eb0 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 63  e database has c
23ec0 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74 68  hanged, flush th
23ed0 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65  e.      ** cache
23ee0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
23ef0 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61   ** Database cha
23f00 6e 67 65 73 20 69 73 20 64 65 74 65 63 74 65 64  nges is detected
23f10 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31   by looking at 1
23f20 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e  5 bytes beginnin
23f30 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66  g.      ** at of
23f40 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65  fset 24 into the
23f50 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73   file.  The firs
23f60 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20  t 4 of these 16 
23f70 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20  bytes are.      
23f80 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e  ** a 32-bit coun
23f90 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72  ter that is incr
23fa0 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63  emented with eac
23fb0 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20  h change.  The. 
23fc0 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79       ** other by
23fd0 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f  tes change rando
23fe0 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69  mly with each fi
23ff0 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20  le change when. 
24000 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20       ** a codec 
24010 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20  is in use..     
24020 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68   ** .      ** Th
24030 65 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69  ere is a vanishi
24040 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63  ngly small chanc
24050 65 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20  e that a change 
24060 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20  will not be .   
24070 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20     ** detected. 
24080 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61   The chance of a
24090 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61  n undetected cha
240a0 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20  nge is so small 
240b0 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74  that.      ** it
240c0 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65   can be neglecte
240d0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
240e0 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72    char dbFileVer
240f0 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  s[sizeof(pPager-
24100 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20  >dbFileVers)];. 
24110 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
24120 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
24130 72 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 69 66  r, 0);..      if
24140 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
24150 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
24160 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
24170 65 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  e;.        goto 
24180 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
24190 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
241a0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
241b0 69 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  id );.      if( 
241c0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30  pPager->dbSize>0
241d0 20 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52   ){.        IOTR
241e0 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20  ACE(("CKVERS %p 
241f0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73  %d\n", pPager, s
24200 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
24210 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  )));.        rc 
24220 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
24230 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46  pPager->fd, &dbF
24240 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
24250 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29  dbFileVers), 24)
24260 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
24270 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
24280 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61           goto fa
24290 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  iled;.        }.
242a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
242b0 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69       memset(dbFi
242c0 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f  leVers, 0, sizeo
242d0 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  f(dbFileVers));.
242e0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
242f0 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72  f( memcmp(pPager
24300 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
24310 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
24320 28 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30  (dbFileVers))!=0
24330 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
24340 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
24350 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
24360 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
24370 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
24380 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
24390 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e==PAGER_SHARED 
243a0 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a  );.  }.. failed:
243b0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
243c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 70  E_OK ){.    /* p
243d0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73  ager_unlock() is
243e0 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 65 78 63   a no-op for exc
243f0 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20  lusive mode and 
24400 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
24410 73 65 73 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65  ses. */.    page
24420 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
24430 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
24440 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  c;.}../*.** If t
24450 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
24460 6e 74 20 68 61 73 20 72 65 61 63 68 65 64 20 7a  nt has reached z
24470 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ero, rollback an
24480 79 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e  y active.** tran
24490 73 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f  saction and unlo
244a0 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a  ck the pager..**
244b0 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c  .** Except, in l
244c0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
244d0 55 53 49 56 45 20 77 68 65 6e 20 74 68 65 72 65  USIVE when there
244e0 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69   is nothing to i
244f0 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  n.** the rollbac
24500 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75  k journal, the u
24510 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72  nlock is not per
24520 66 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65  formed and there
24530 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74   is.** nothing t
24540 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74  o rollback, so t
24550 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
24560 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74   no-op..*/ .stat
24570 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
24580 6f 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65  ockIfUnused(Page
24590 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
245a0 28 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65  ( (sqlite3Pcache
245b0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
245c0 3e 70 50 43 61 63 68 65 29 3d 3d 30 29 0a 20 20  >pPCache)==0).  
245d0 20 26 26 20 28 21 70 50 61 67 65 72 2d 3e 65 78   && (!pPager->ex
245e0 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
245f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
24600 66 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70  f>0) .  ){.    p
24610 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
24620 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
24630 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 72 6f 70   }.}../*.** Drop
24640 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
24650 20 63 61 63 68 65 20 75 73 69 6e 67 20 73 71 6c   cache using sql
24660 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 29  ite3PcacheDrop()
24670 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
24680 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65 20  means there are 
24690 6e 6f 77 20 6e 6f 20 70 61 67 65 73 20 77 69 74  now no pages wit
246a0 68 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  h references to 
246b0 74 68 65 6d 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  them, a rollback
246c0 0a 2a 2a 20 6f 63 63 75 72 73 20 61 6e 64 20 74  .** occurs and t
246d0 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  he lock on the d
246e0 61 74 61 62 61 73 65 20 69 73 20 72 65 6d 6f 76  atabase is remov
246f0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
24700 69 64 20 70 61 67 65 72 44 72 6f 70 50 61 67 65  id pagerDropPage
24710 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
24720 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
24730 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
24740 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f  sqlite3PcacheDro
24750 70 28 70 50 67 29 3b 0a 20 20 70 61 67 65 72 55  p(pPg);.  pagerU
24760 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50  nlockIfUnused(pP
24770 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ager);.}../*.** 
24780 41 63 71 75 69 72 65 20 61 20 72 65 66 65 72 65  Acquire a refere
24790 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  nce to page numb
247a0 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65 72  er pgno in pager
247b0 20 70 50 61 67 65 72 20 28 61 20 70 61 67 65 0a   pPager (a page.
247c0 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61 73  ** reference has
247d0 20 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e 20   type DbPage*). 
247e0 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
247f0 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a   reference is .*
24800 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  * successfully o
24810 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63  btained, it is c
24820 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65  opied to *ppPage
24830 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
24840 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
24850 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  his function cal
24860 6c 73 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f  ls pagerSharedLo
24870 63 6b 28 29 20 74 6f 20 6f 62 74 61 69 6e 20 61  ck() to obtain a
24880 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 0a   SHARED lock on.
24890 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
248a0 66 69 6c 65 20 69 66 20 73 75 63 68 20 61 20 6c  file if such a l
248b0 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 69  ock or greater i
248c0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 65  s not already he
248d0 6c 64 2e 0a 2a 2a 20 54 68 69 73 20 6d 61 79 20  ld..** This may 
248e0 63 61 75 73 65 20 68 6f 74 2d 6a 6f 75 72 6e 61  cause hot-journa
248f0 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20  l rollback or a 
24900 63 61 63 68 65 20 70 75 72 67 65 2e 20 53 65 65  cache purge. See
24910 20 63 6f 6d 6d 65 6e 74 73 0a 2a 2a 20 61 62 6f   comments.** abo
24920 76 65 20 66 75 6e 63 74 69 6f 6e 20 70 61 67 65  ve function page
24930 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 66 6f  rSharedLock() fo
24940 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a  r details..**.**
24950 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
24960 64 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  d page is alread
24970 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  y in the cache, 
24980 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  it is returned. 
24990 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
249a0 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74   new page object
249b0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
249c0 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
249d0 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72   data.** read fr
249e0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
249f0 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61  file. In some ca
24a00 73 65 73 2c 20 74 68 65 20 70 63 61 63 68 65 20  ses, the pcache 
24a10 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68  module may.** ch
24a20 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f  oose not to allo
24a30 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  cate a new page 
24a40 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72  object and may r
24a50 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  euse an existing
24a60 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20  .** object with 
24a70 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
24a80 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a  eferences..**.**
24a90 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20   The extra data 
24aa0 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61  appended to a pa
24ab0 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69  ge is always ini
24ac0 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f  tialized to zero
24ad0 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20  s the .** first 
24ae0 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c  time a page is l
24af0 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72  oaded into memor
24b00 79 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 72  y. If the page r
24b10 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20  equested is .** 
24b20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
24b30 61 63 68 65 20 77 68 65 6e 20 74 68 69 73 20 66  ache when this f
24b40 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
24b50 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74 72  d, then the extr
24b60 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66  a.** data is lef
24b70 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e  t as it was when
24b80 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74   the page object
24b90 20 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a   was last used..
24ba0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
24bb0 61 62 61 73 65 20 69 6d 61 67 65 20 69 73 20 73  abase image is s
24bc0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
24bd0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 6f  requested page o
24be0 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a  r if a .** non-z
24bf0 65 72 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73  ero value is pas
24c00 73 65 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e  sed as the noCon
24c10 74 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61  tent parameter a
24c20 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65  nd the .** reque
24c30 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
24c40 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20   already stored 
24c50 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74 68  in the cache, th
24c60 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c  en no .** actual
24c70 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72   disk read occur
24c80 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
24c90 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
24ca0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   of the .** page
24cb0 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
24cc0 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a  to all zeros. .*
24cd0 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  *.** If noConten
24ce0 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65  t is true, it me
24cf0 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
24d00 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ot care about th
24d10 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66  e contents.** of
24d20 20 74 68 65 20 70 61 67 65 2e 20 54 68 69 73 20   the page. This 
24d30 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20 73 65  occurs in two se
24d40 70 65 72 61 74 65 20 73 63 65 6e 61 72 69 6f 73  perate scenarios
24d50 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65  :.**.**   a) Whe
24d60 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72 65 65  n reading a free
24d70 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
24d80 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
24d90 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62  e, and.**.**   b
24da0 29 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69  ) When a savepoi
24db0 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  nt is being roll
24dc0 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e  ed back and we n
24dd0 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20  eed to load.**  
24de0 20 20 20 20 61 20 6e 65 77 20 70 61 67 65 20 69      a new page i
24df0 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f  nto the cache to
24e00 20 70 6f 70 75 6c 61 74 65 20 77 69 74 68 20 74   populate with t
24e10 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20  he data read.** 
24e20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61       from the sa
24e30 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e  vepoint journal.
24e40 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  .**.** If noCont
24e50 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65  ent is true, the
24e60 6e 20 74 68 65 20 64 61 74 61 20 72 65 74 75 72  n the data retur
24e70 6e 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e  ned is zeroed in
24e80 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e  stead of.** bein
24e90 67 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  g read from the 
24ea0 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69  database. Additi
24eb0 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73  onally, the bits
24ec0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
24ed0 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67  * to pgno in Pag
24ee0 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62  er.pInJournal (b
24ef0 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61  itvec of pages a
24f00 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e 20 74  lready written t
24f10 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  o the.** journal
24f20 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50   file) and the P
24f30 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
24f40 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65  nSavepoint bitve
24f50 63 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a  cs of any open.*
24f60 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  * savepoints are
24f70 20 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73   set. This means
24f80 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
24f90 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 61 74  made writable at
24fa0 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e   any.** point in
24fb0 20 74 68 65 20 66 75 74 75 72 65 2c 20 75 73 69   the future, usi
24fc0 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  ng a call to sql
24fd0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
24fe0 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a  , its contents.*
24ff0 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f  * will not be jo
25000 75 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61  urnaled. This sa
25010 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68  ves IO..**.** Th
25020 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
25030 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
25040 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
25050 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
25060 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
25070 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
25080 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
25090 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
250a0 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
250b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
250c0 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69  kup().  Both thi
250d0 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f  s routine and Lo
250e0 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a  okup() attempt.*
250f0 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  * to find a page
25100 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
25110 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20  y cache first.  
25120 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
25130 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
25140 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f   memory, this ro
25150 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69  utine goes to di
25160 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e  sk to read it in
25170 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28   whereas Lookup(
25180 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e  ).** just return
25190 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69  s 0.  This routi
251a0 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65  ne acquires a re
251b0 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73  ad-lock the firs
251c0 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73  t time it.** has
251d0 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20   to go to disk, 
251e0 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70  and could also p
251f0 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a  layback an old j
25200 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
25210 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f  ary..** Since Lo
25220 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65  okup() never goe
25230 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65  s to disk, it ne
25240 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20  ver has to deal 
25250 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72  with locks.** or
25260 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
25270 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
25280 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61  gerAcquire(.  Pa
25290 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
252a0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
252b0 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
252c0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
252d0 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
252e0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
252f0 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44   to fetch */.  D
25300 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  bPage **ppPage, 
25310 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f     /* Write a po
25320 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
25330 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
25340 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20  noContent       
25350 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72  /* Do not bother
25360 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74   reading content
25370 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72   from disk if tr
25380 75 65 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72  ue */.){.  PgHdr
25390 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 69 6e 74   *pPg = 0;.  int
253a0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
253b0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
253c0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
253d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
253e0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
253f0 4f 43 4b 20 0a 20 20 20 20 20 20 20 7c 7c 20 73  OCK .       || s
25400 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
25410 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
25420 61 63 68 65 29 3e 30 20 0a 20 20 20 20 20 20 20  ache)>0 .       
25430 7c 7c 20 70 67 6e 6f 3d 3d 31 0a 20 20 29 3b 0a  || pgno==1.  );.
25440 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75  .  /* The maximu
25450 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  m page number is
25460 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51   2^31. Return SQ
25470 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
25480 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62  a page.  ** numb
25490 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
254a0 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69  this, or zero, i
254b0 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a  s requested..  *
254c0 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47  /.  if( pgno>PAG
254d0 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70  ER_MAX_PGNO || p
254e0 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
254f0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
25500 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74  ager) ){.    ret
25510 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
25520 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
25530 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  /* Make sure we 
25540 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79  have not hit any
25550 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73   critical errors
25560 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74  ..  */ .  assert
25570 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
25580 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20   *ppPage = 0;.. 
25590 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
255a0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 61 63  he first page ac
255b0 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65 74  cessed, then get
255c0 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20   a SHARED lock. 
255d0 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62   ** on the datab
255e0 61 73 65 20 66 69 6c 65 2e 20 70 61 67 65 72 53  ase file. pagerS
255f0 68 61 72 65 64 4c 6f 63 6b 28 29 20 69 73 20 61  haredLock() is a
25600 20 6e 6f 2d 6f 70 20 69 66 20 0a 20 20 2a 2a 20   no-op if .  ** 
25610 61 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20  a database lock 
25620 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2e  is already held.
25630 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
25640 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 50 61  erSharedLock(pPa
25650 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
25660 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25670 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
25680 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
25690 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
256a0 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 72 63 20 3d  NLOCK );..  rc =
256b0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
256c0 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
256d0 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 26 70  che, pgno, 1, &p
256e0 50 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  Pg);.  if( rc!=S
256f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25700 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
25710 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
25720 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73  no==pgno );.  as
25730 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
25740 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 70 50 67  r==pPager || pPg
25750 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 20  ->pPager==0 );. 
25760 20 69 66 28 20 70 50 67 2d 3e 70 50 61 67 65 72   if( pPg->pPager
25770 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
25780 65 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61  e pager cache ha
25790 73 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20  s created a new 
257a0 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e  page. Its conten
257b0 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20  t needs to .    
257c0 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ** be initialize
257d0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  d..    */.    in
257e0 74 20 6e 4d 61 78 3b 0a 20 20 20 20 50 41 47 45  t nMax;.    PAGE
257f0 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
25800 4d 69 73 73 29 3b 0a 20 20 20 20 70 50 67 2d 3e  Miss);.    pPg->
25810 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
25820 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
25830 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
25840 28 70 50 61 67 65 72 2c 20 26 6e 4d 61 78 29 3b  (pPager, &nMax);
25850 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
25860 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25870 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
25880 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 72 65  f(pPg);.      re
25890 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
258a0 20 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e      if( nMax<(in
258b0 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20  t)pgno || MEMDB 
258c0 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a  || noContent ){.
258d0 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70        if( pgno>p
258e0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
258f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
25900 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
25910 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
25920 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
25930 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
25940 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
25950 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74      /* Failure t
25960 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 20 69  o set the bits i
25970 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20  n the InJournal 
25980 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62  bit-vectors is b
25990 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a  enign..        *
259a0 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e  * It merely mean
259b0 73 20 74 68 61 74 20 77 65 20 6d 69 67 68 74 20  s that we might 
259c0 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f  do some extra wo
259d0 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20  rk to journal a 
259e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
259f0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
25a00 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61  eed to be journa
25a10 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65  led.  Neverthele
25a20 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20  ss, be sure .   
25a30 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20       ** to test 
25a40 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20 61  the case where a
25a50 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63   malloc error oc
25a60 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
25a70 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20  g to set .      
25a80 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20    ** a bit in a 
25a90 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20  bit vector..    
25aa0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
25ab0 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
25ac0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
25ad0 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61     if( pgno<=pPa
25ae0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
25af0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45 53  ){.          TES
25b00 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71  TONLY( rc = ) sq
25b10 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
25b20 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
25b30 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  l, pgno);.      
25b40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
25b50 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
25b60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
25b70 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63      TESTONLY( rc
25b80 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f   = ) addToSavepo
25b90 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
25ba0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  r, pgno);.      
25bb0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
25bc0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
25bd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
25be0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
25bf0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
25c00 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50         memset(pP
25c10 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61  g->pData, 0, pPa
25c20 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
25c30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 49 4f        }.      IO
25c40 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20  TRACE(("ZERO %p 
25c50 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
25c60 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  gno));.    }else
25c70 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
25c80 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  pPg->pPager==pPa
25c90 67 65 72 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ger );.      rc 
25ca0 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67  = readDbPage(pPg
25cb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
25cc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25cd0 20 20 20 20 20 20 70 61 67 65 72 44 72 6f 70 50        pagerDropP
25ce0 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
25cf0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
25d00 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65     }.    }.#ifde
25d10 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
25d20 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
25d30 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
25d40 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
25d50 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
25d60 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
25d70 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74 68  ed page is in th
25d80 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
25d90 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28  .    PAGER_INCR(
25da0 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20  pPager->nHit);. 
25db0 20 7d 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20   }..  *ppPage = 
25dc0 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  pPg;.  return SQ
25dd0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
25de0 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
25df0 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
25e00 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  y in the in-memo
25e10 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a  ry cache.  Do.**
25e20 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61   not read the pa
25e30 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52  ge from disk.  R
25e40 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
25e50 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20  to the page,.** 
25e60 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65  or 0 if the page
25e70 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
25e80 2e 20 41 6c 73 6f 2c 20 72 65 74 75 72 6e 20 30  . Also, return 0
25e90 20 69 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   if the .** page
25ea0 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f 55 4e  r is in PAGER_UN
25eb0 4c 4f 43 4b 20 73 74 61 74 65 20 77 68 65 6e 20  LOCK state when 
25ec0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
25ed0 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 6f 72 20 69   called,.** or i
25ee0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
25ef0 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
25f00 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
25f10 54 45 5f 46 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53  TE_FULL..**.** S
25f20 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50  ee also sqlite3P
25f30 61 67 65 72 47 65 74 28 29 2e 20 20 54 68 65 20  agerGet().  The 
25f40 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
25f50 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
25f60 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61  ** and sqlite3Pa
25f70 67 65 72 47 65 74 28 29 20 69 73 20 74 68 61 74  gerGet() is that
25f80 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20   _get() will go 
25f90 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20  to the disk and 
25fa0 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  read.** in the p
25fb0 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65 20  age if the page 
25fc0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69  is not already i
25fd0 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72  n cache.  This r
25fe0 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
25ff0 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61  s NULL if the pa
26000 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
26010 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20  he or if a disk 
26020 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61  I/O error .** ha
26030 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e  s ever happened.
26040 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69  .*/.DbPage *sqli
26050 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50  te3PagerLookup(P
26060 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
26070 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
26080 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 61 73  r *pPg = 0;.  as
26090 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
260a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  );.  assert( pgn
260b0 6f 21 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28  o!=0 );..  if( (
260c0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
260d0 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 0a 20 20 20  AGER_UNLOCK).   
260e0 26 26 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43  && (pPager->errC
260f0 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  ode==SQLITE_OK |
26100 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  | pPager->errCod
26110 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 0a  e==SQLITE_FULL).
26120 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33    ){.    sqlite3
26130 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67  PcacheFetch(pPag
26140 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
26150 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20 20 7d  o, 0, &pPg);.  }
26160 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a  ..  return pPg;.
26170 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
26180 20 61 20 70 61 67 65 20 72 65 66 65 72 65 6e 63   a page referenc
26190 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
261a0 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
261b0 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
261c0 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74   drop to zero, t
261d0 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  hen the.** page 
261e0 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
261f0 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20  LRU list.  When 
26200 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74  all references t
26210 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61  o all pages.** a
26220 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72  re released, a r
26230 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61  ollback occurs a
26240 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
26250 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a  he database is.*
26260 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f  * removed..*/.vo
26270 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  id sqlite3PagerU
26280 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  nref(DbPage *pPg
26290 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  ){.  if( pPg ){.
262a0 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
262b0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
262c0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
262d0 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
262e0 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49      pagerUnlockI
262f0 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b  fUnused(pPager);
26300 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
26310 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
26320 6c 20 66 69 6c 65 20 68 61 73 20 61 6c 72 65 61  l file has alrea
26330 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  dy been opened, 
26340 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 0a  ensure that the.
26350 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  ** sub-journal f
26360 69 6c 65 20 69 73 20 6f 70 65 6e 20 74 6f 6f 2e  ile is open too.
26370 20 49 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   If the main jou
26380 72 6e 61 6c 20 69 73 20 6e 6f 74 20 6f 70 65 6e  rnal is not open
26390 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  ,.** this functi
263a0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
263b0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
263c0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 65 76  s returned if ev
263d0 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63  erything goes ac
263e0 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e  cording to plan.
263f0 20 0a 2a 2a 20 41 6e 20 53 51 4c 49 54 45 5f 49   .** An SQLITE_I
26400 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63  OERR_XXX error c
26410 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
26420 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 0a 2a 2a  if a call to .**
26430 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29   sqlite3OsOpen()
26440 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
26450 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75  c int openSubJou
26460 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
26470 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
26480 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
26490 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
264a0 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28  jfd) && !isOpen(
264b0 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b  pPager->sjfd) ){
264c0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
264d0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
264e0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
264f0 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72  MEMORY || pPager
26500 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29  ->subjInMemory )
26510 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d  {.      sqlite3M
26520 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50  emJournalOpen(pP
26530 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20  ager->sjfd);.   
26540 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
26550 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70   = pagerOpentemp
26560 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
26570 3e 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50  >sjfd, SQLITE_OP
26580 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a  EN_SUBJOURNAL);.
26590 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
265a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
265b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
265c0 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73   called at the s
265d0 74 61 72 74 20 6f 66 20 65 76 65 72 79 20 77 72  tart of every wr
265e0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
265f0 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61  .** There must a
26600 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45  lready be a RESE
26610 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
26620 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
26630 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
26640 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
26650 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  e is called..**.
26660 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  ** Open the jour
26670 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
26680 65 72 20 70 50 61 67 65 72 20 61 6e 64 20 77 72  er pPager and wr
26690 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65  ite a journal he
266a0 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73  ader.** to the s
266b0 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74  tart of it. If t
266c0 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20  here are active 
266d0 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e  savepoints, open
266e0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
266f0 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69  .** as well. Thi
26700 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
26710 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  ly used when the
26720 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
26730 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65   being .** opene
26740 64 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c  d to write a rol
26750 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20  lback log for a 
26760 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20  transaction. It 
26770 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20  is not used .** 
26780 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68  when opening a h
26790 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot journal file 
267a0 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  to roll it back.
267b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
267c0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c  urnal file is al
267d0 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69  ready open (as i
267e0 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c  t may be in excl
267f0 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20  usive mode),.** 
26800 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
26810 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20 61  on just writes a
26820 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
26830 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
26840 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f  the.** already o
26850 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  pen file. .**.**
26860 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
26870 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
26880 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68   is opened by th
26890 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  is function, the
268a0 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  .** Pager.pInJou
268b0 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72 75  rnal bitvec stru
268c0 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
268d0 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
268e0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
268f0 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
26900 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73  essful. Otherwis
26910 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  e, return .** SQ
26920 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68  LITE_NOMEM if th
26930 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c  e attempt to all
26940 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a  ocate Pager.pInJ
26950 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72  ournal fails, or
26960 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72   .** an IO error
26970 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67   code if opening
26980 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
26990 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69  journal file fai
269a0 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
269b0 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  t pager_open_jou
269c0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
269d0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
269e0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
269f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a00 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
26a10 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
26a20 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d  s * const pVfs =
26a30 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20   pPager->pVfs;  
26a40 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
26a50 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a  of vfs pointer *
26a60 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
26a70 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
26a80 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
26a90 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
26aa0 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
26ab0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
26ac0 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
26ad0 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65  .  .  /* If alre
26ae0 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72  ady in the error
26af0 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e   state, this fun
26b00 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
26b10 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  . */.  if( pPage
26b20 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
26b30 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
26b40 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20  >errCode;.  }.. 
26b50 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20   /* TODO: Is it 
26b60 72 65 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20  really possible 
26b70 74 6f 20 67 65 74 20 68 65 72 65 20 77 69 74 68  to get here with
26b80 20 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 3f   dbSizeValid==0?
26b90 20 49 66 20 6e 6f 74 2c 0a 20 20 2a 2a 20 74 68   If not,.  ** th
26ba0 65 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72 50  e call to PagerP
26bb0 61 67 65 63 6f 75 6e 74 28 29 20 63 61 6e 20 62  agecount() can b
26bc0 65 20 72 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a  e removed..  */.
26bd0 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
26be0 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d  er->dbSizeValid=
26bf0 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  =0 );.  sqlite3P
26c00 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
26c10 61 67 65 72 2c 20 30 29 3b 0a 0a 20 20 70 50 61  ager, 0);..  pPa
26c20 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
26c30 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
26c40 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62  reate(pPager->db
26c50 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 70 50 61  Size);.  if( pPa
26c60 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
26c70 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
26c80 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
26c90 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68   }..  /* Open th
26ca0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
26cb0 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
26cc0 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 69  ady open. */.  i
26cd0 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
26ce0 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 69  r->jfd) ){.    i
26cf0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
26d00 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
26d10 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
26d20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
26d30 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  3MemJournalOpen(
26d40 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
26d50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
26d60 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
26d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d80 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20     /* VFS flags 
26d90 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  to open journal 
26da0 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  file */.        
26db0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
26dc0 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
26dd0 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20  N_CREATE|.      
26de0 20 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46    (pPager->tempF
26df0 69 6c 65 20 3f 20 0a 20 20 20 20 20 20 20 20 20  ile ? .         
26e00 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45   (SQLITE_OPEN_DE
26e10 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49  LETEONCLOSE|SQLI
26e20 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
26e30 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20 20 20 20  RNAL):.         
26e40 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   (SQLITE_OPEN_MA
26e50 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20  IN_JOURNAL).    
26e60 20 20 20 20 29 3b 0a 23 69 66 64 65 66 20 53 51      );.#ifdef SQ
26e70 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
26e80 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 72  IC_WRITE.      r
26e90 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  c = sqlite3Journ
26ea0 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20  alOpen(.        
26eb0 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e    pVfs, pPager->
26ec0 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
26ed0 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72  ->jfd, flags, jr
26ee0 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61  nlBufferSize(pPa
26ef0 67 65 72 29 0a 20 20 20 20 20 20 29 3b 0a 23 65  ger).      );.#e
26f00 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 73  lse.      rc = s
26f10 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
26f20 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
26f30 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
26f40 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65 6e  , flags, 0);.#en
26f50 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  dif.    }.    as
26f60 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
26f70 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50  _OK || isOpen(pP
26f80 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
26f90 7d 0a 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  }...  /* Write t
26fa0 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
26fb0 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a   header to the j
26fc0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20  ournal file and 
26fd0 6f 70 65 6e 20 0a 20 20 2a 2a 20 74 68 65 20 73  open .  ** the s
26fe0 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ub-journal if ne
26ff0 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
27000 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27010 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f  K ){.    /* TODO
27020 3a 20 43 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f  : Check if all o
27030 66 20 74 68 65 73 65 20 61 72 65 20 72 65 61 6c  f these are real
27040 6c 79 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  ly required. */.
27050 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72      pPager->dbOr
27060 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  igSize = pPager-
27070 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 70 50 61  >dbSize;.    pPa
27080 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
27090 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ted = 0;.    pPa
270a0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
270b0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  0;.    pPager->n
270c0 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Rec = 0;.    pPa
270d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
270e0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
270f0 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
27100 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
27110 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20  nalHdr = 0;.    
27120 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
27130 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
27140 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
27150 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
27160 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20  >nSavepoint ){. 
27170 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a     rc = openSubJ
27180 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
27190 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53    }..  if( rc!=S
271a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
271b0 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
271c0 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
271d0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50  Journal);.    pP
271e0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
271f0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
27200 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
27210 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72  Begin a write-tr
27220 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
27230 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 72   specified pager
27240 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a   object. If a .*
27250 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  * write-transact
27260 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
27270 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69  been opened, thi
27280 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
27290 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
272a0 74 68 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d  the exFlag argum
272b0 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68  ent is false, th
272c0 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65  en acquire at le
272d0 61 73 74 20 61 20 52 45 53 45 52 56 45 44 0a 2a  ast a RESERVED.*
272e0 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  * lock on the da
272f0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
27300 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20  exFlag is true, 
27310 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20  then acquire at 
27320 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c  least.** an EXCL
27330 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73  USIVE lock. If s
27340 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c  uch a lock is al
27350 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c  ready held, no l
27360 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74  ocking .** funct
27370 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c  ions need be cal
27380 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  led..**.** If th
27390 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70  is is not a temp
273a0 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f  orary or in-memo
273b0 72 79 20 66 69 6c 65 20 61 6e 64 2c 20 74 68 65  ry file and, the
273c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
273d0 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 69 66 20 69   .** opened if i
273e0 74 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  t has not been a
273f0 6c 72 65 61 64 79 2e 20 46 6f 72 20 61 20 74 65  lready. For a te
27400 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 20 74 68  mporary file, th
27410 65 20 6f 70 65 6e 69 6e 67 20 0a 2a 2a 20 6f 66  e opening .** of
27420 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
27430 65 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  e is deferred un
27440 74 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e 20  til there is an 
27450 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 0a  actual need to .
27460 2a 2a 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ** write to the 
27470 6a 6f 75 72 6e 61 6c 2e 20 54 4f 44 4f 3a 20 57  journal. TODO: W
27480 68 79 20 68 61 6e 64 6c 65 20 74 65 6d 70 6f 72  hy handle tempor
27490 61 72 79 20 66 69 6c 65 73 20 64 69 66 66 65 72  ary files differ
274a0 65 6e 74 6c 79 3f 0a 2a 2a 0a 2a 2a 20 49 66 20  ently?.**.** If 
274b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
274c0 20 69 73 20 6f 70 65 6e 65 64 20 28 6f 72 20 69   is opened (or i
274d0 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
274e0 6f 70 65 6e 29 2c 20 74 68 65 6e 20 61 0a 2a 2a  open), then a.**
274f0 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
27500 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
27510 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e 0a 2a  e start of it..*
27520 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a  *.** If the subj
27530 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e  InMemory argumen
27540 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  t is non-zero, t
27550 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72  hen any sub-jour
27560 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69  nal opened.** wi
27570 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  thin this transa
27580 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70  ction will be op
27590 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65  ened as an in-me
275a0 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a  mory file. This.
275b0 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74  ** has no effect
275c0 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   if the sub-jour
275d0 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f  nal is already o
275e0 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79  pened (as it may
275f0 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e   be when.** runn
27600 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
27610 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65   mode) or if the
27620 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65   transaction doe
27630 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a  s not require a.
27640 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  ** sub-journal. 
27650 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d  If the subjInMem
27660 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ory argument is 
27670 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72  zero, then any r
27680 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a  equired.** sub-j
27690 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d  ournal is implem
276a0 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20  ented in-memory 
276b0 69 66 20 70 50 61 67 65 72 20 69 73 20 61 6e 20  if pPager is an 
276c0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
276d0 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67  se, .** or using
276e0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
276f0 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
27700 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
27710 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61  Begin(Pager *pPa
27720 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c  ger, int exFlag,
27730 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   int subjInMemor
27740 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  y){.  int rc = S
27750 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
27760 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
27770 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
27780 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62  );.  pPager->sub
27790 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29  jInMemory = (u8)
277a0 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 20 20  subjInMemory;.  
277b0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
277c0 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e==PAGER_SHARED 
277d0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
277e0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
277f0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  l==0 );.    asse
27800 72 74 28 20 21 4d 45 4d 44 42 20 26 26 20 21 70  rt( !MEMDB && !p
27810 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
27820 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 62 74 61 69  );..    /* Obtai
27830 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
27840 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
27850 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65  e file. If the e
27860 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a  xFlag parameter.
27870 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20      ** is true, 
27880 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  then immediately
27890 20 75 70 67 72 61 64 65 20 74 68 69 73 20 74 6f   upgrade this to
278a0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
278b0 63 6b 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 62  ck. The.    ** b
278c0 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
278d0 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64  back can be used
278e0 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
278f0 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  to the EXCLUSIVE
27900 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75  .    ** lock, bu
27910 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61 69  t not when obtai
27920 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52 56 45  ning the RESERVE
27930 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  D lock..    */. 
27940 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
27950 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
27960 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
27970 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
27980 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
27990 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
279a0 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b   PAGER_RESERVED;
279b0 0a 20 20 20 20 20 20 69 66 28 20 65 78 46 6c 61  .      if( exFla
279c0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  g ){.        rc 
279d0 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
279e0 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
279f0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
27a00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
27a10 20 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75 69   /* If the requi
27a20 72 65 64 20 6c 6f 63 6b 73 20 77 65 72 65 20 73  red locks were s
27a30 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61  uccessfully obta
27a40 69 6e 65 64 2c 20 6f 70 65 6e 20 74 68 65 20 6a  ined, open the j
27a50 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
27a60 6c 65 20 61 6e 64 20 77 72 69 74 65 20 74 68 65  le and write the
27a70 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68   first journal-h
27a80 65 61 64 65 72 20 74 6f 20 69 74 2e 0a 20 20 20  eader to it..   
27a90 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
27aa0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
27ab0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a  ger->useJournal.
27ac0 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
27ad0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
27ae0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
27af0 46 46 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  FF .    ){.     
27b00 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
27b10 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
27b20 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
27b30 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
27b40 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65  r->jfd) && pPage
27b50 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
27b60 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
27b70 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74 68 65  happens when the
27b80 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 78   pager was in ex
27b90 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
27ba0 6f 64 65 20 74 68 65 20 6c 61 73 74 0a 20 20 20  ode the last.   
27bb0 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64   ** time a (read
27bc0 20 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e 73   or write) trans
27bd0 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65  action was succe
27be0 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65  ssfully conclude
27bf0 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73  d.    ** by this
27c00 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73   connection. Ins
27c10 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67  tead of deleting
27c20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
27c30 65 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a  e it was .    **
27c40 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 65   kept open and e
27c50 69 74 68 65 72 20 77 61 73 20 74 72 75 6e 63 61  ither was trunca
27c60 74 65 64 20 74 6f 20 30 20 62 79 74 65 73 20 6f  ted to 0 bytes o
27c70 72 20 69 74 73 20 68 65 61 64 65 72 20 77 61 73  r its header was
27c80 0a 20 20 20 20 2a 2a 20 6f 76 65 72 77 72 69 74  .    ** overwrit
27c90 74 65 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a  ten with zeros..
27ca0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
27cb0 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d  t( pPager->nRec=
27cc0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
27cd0 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ( pPager->dbOrig
27ce0 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Size==0 );.    a
27cf0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
27d00 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
27d10 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f      rc = pager_o
27d20 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67  pen_journal(pPag
27d30 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45  er);.  }..  PAGE
27d40 52 54 52 41 43 45 28 28 22 54 52 41 4e 53 41 43  RTRACE(("TRANSAC
27d50 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45  TION %d\n", PAGE
27d60 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
27d70 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
27d80 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c  (pPager->jfd) ||
27d90 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
27da0 4f 66 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c  Off>0 || rc!=SQL
27db0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75  ITE_OK );.  retu
27dc0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
27dd0 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20 64 61  Mark a single da
27de0 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65  ta page as write
27df0 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  able. The page i
27e00 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
27e10 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72  he .** main jour
27e20 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e  nal or sub-journ
27e30 61 6c 20 61 73 20 72 65 71 75 69 72 65 64 2e 20  al as required. 
27e40 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 77  If the page is w
27e50 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f  ritten into.** o
27e60 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
27e70 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ls, the correspo
27e80 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74  nding bit is set
27e90 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67 65   in the .** Page
27ea0 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  r.pInJournal bit
27eb0 76 65 63 20 61 6e 64 20 74 68 65 20 50 61 67 65  vec and the Page
27ec0 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61  rSavepoint.pInSa
27ed0 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 0a  vepoint bitvecs.
27ee0 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73  ** of any open s
27ef0 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61 70 70  avepoints as app
27f00 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61  ropriate..*/.sta
27f10 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
27f20 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ite(PgHdr *pPg){
27f30 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d  .  void *pData =
27f40 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50   pPg->pData;.  P
27f50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
27f60 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
27f70 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
27f80 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  ;..  /* Check fo
27f90 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20  r errors.  */.  
27fa0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
27fb0 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75  ode ){ .    retu
27fc0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
27fd0 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  de;.  }.  if( pP
27fe0 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ager->readOnly )
27ff0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
28000 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20  ITE_PERM;.  }.. 
28010 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
28020 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a  ->setMaster );..
28030 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67    CHECK_PAGE(pPg
28040 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68  );..  /* Mark th
28050 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e  e page as dirty.
28060 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61    If the page ha
28070 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
28080 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74  ritten.  ** to t
28090 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20  he journal then 
280a0 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69  we can return ri
280b0 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20  ght away..  */. 
280c0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
280d0 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20  keDirty(pPg);.  
280e0 69 66 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61  if( pageInJourna
280f0 6c 28 70 50 67 29 20 26 26 20 21 73 75 62 6a 52  l(pPg) && !subjR
28100 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
28110 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
28120 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a  dbModified = 1;.
28130 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a    }else{..    /*
28140 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20   If we get this 
28150 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  far, it means th
28160 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64  at the page need
28170 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77  s to be.    ** w
28180 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72  ritten to the tr
28190 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
281a0 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f  l or the ckeckpo
281b0 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  int journal.    
281c0 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20  ** or both..    
281d0 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20  **.    ** First 
281e0 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61  check to see tha
281f0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
28200 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  n journal exists
28210 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65 61   and.    ** crea
28220 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65 73  te it if it does
28230 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   not..    */.   
28240 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
28250 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
28260 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  LOCK );.    rc =
28270 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
28280 69 6e 28 70 50 61 67 65 72 2c 20 30 2c 20 70 50  in(pPager, 0, pP
28290 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f  ager->subjInMemo
282a0 72 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ry);.    if( rc!
282b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
282c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
282d0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
282e0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
282f0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
28300 3b 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70 65  ;.    if( !isOpe
28310 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
28320 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  & pPager->useJou
28330 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 20 20 26  rnal.          &
28340 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
28350 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
28360 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a  RNALMODE_OFF ){.
28370 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
28380 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
28390 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
283a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
283b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
283c0 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  }.    pPager->db
283d0 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20 20  Modified = 1;.  
283e0 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e  .    /* The tran
283f0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
28400 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77  now exists and w
28410 65 20 68 61 76 65 20 61 20 52 45 53 45 52 56 45  e have a RESERVE
28420 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45  D or an.    ** E
28430 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
28440 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
28450 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20  se file.  Write 
28460 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
28470 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74   to.    ** the t
28480 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
28490 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  al if it is not 
284a0 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
284b0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70     */.    if( !p
284c0 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67  ageInJournal(pPg
284d0 29 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  ) && isOpen(pPag
284e0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
284f0 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c    if( pPg->pgno<
28500 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
28510 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ize ){.        u
28520 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20  32 cksum;.      
28530 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
28540 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73  .        /* We s
28550 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74  hould never writ
28560 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
28570 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74   file the page t
28580 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  hat.        ** c
28590 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
285a0 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65  base locks.  The
285b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
285c0 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20  t verifies.     
285d0 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
285e0 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20   not. */.       
285f0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
28600 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no!=PAGER_MJ_PGN
28610 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  O(pPager) );.   
28620 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
28630 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
28640 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20  pgno, 7, return 
28650 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44  SQLITE_NOMEM, pD
28660 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 63  ata2);.        c
28670 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73  ksum = pager_cks
28680 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
28690 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20  pData2);.       
286a0 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
286b0 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  s(pPager->jfd, p
286c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
286d0 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  f, pPg->pgno);. 
286e0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
286f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28700 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
28710 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
28720 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70  ->jfd, pData2, p
28730 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
28740 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
28760 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
28770 66 20 2b 20 34 29 3b 0a 20 20 20 20 20 20 20 20  f + 4);.        
28780 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
28790 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e  lOff += pPager->
287a0 70 61 67 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20  pageSize+4;.    
287b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
287c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
287d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
287e0 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
287f0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
28800 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 63  r->journalOff, c
28810 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  ksum);.         
28820 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
28830 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20  Off += 4;.      
28840 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52    }.        IOTR
28850 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64  ACE(("JOUT %p %d
28860 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
28870 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ger, pPg->pgno, 
28880 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28890 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
288a0 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61  lOff, pPager->pa
288b0 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20  geSize));.      
288c0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
288d0 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
288e0 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  j_count);.      
288f0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4a    PAGERTRACE(("J
28900 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
28910 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61  d needSync=%d ha
28920 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
28930 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
28940 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
28950 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20  pgno, .         
28960 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73      ((pPg->flags
28970 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
28980 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61  )?1:0), pager_pa
28990 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a  gehash(pPg)));..
289a0 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65 6e 20          /* Even 
289b0 69 66 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b  if an IO or disk
289c0 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75 72  full error occur
289d0 72 65 64 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61  red while journa
289e0 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20  lling the.      
289f0 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
28a00 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65   block above, se
28a10 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e 63 20  t the need-sync 
28a20 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70 61 67  flag for the pag
28a30 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 74  e..        ** Ot
28a40 68 65 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68  herwise, when th
28a50 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
28a60 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68   rolled back, th
28a70 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20 20  e logic in.     
28a80 20 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f     ** playback_o
28a90 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20 74  ne_page() will t
28aa0 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70 61  hink that the pa
28ab0 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  ge needs to be r
28ac0 65 73 74 6f 72 65 64 0a 20 20 20 20 20 20 20 20  estored.        
28ad0 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
28ae0 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20  se file. And if 
28af0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
28b00 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73  rs while doing s
28b10 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  o,.        ** th
28b20 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61  en corruption ma
28b30 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20  y follow..      
28b40 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
28b50 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
28b60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
28b70 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
28b80 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20  R_NEED_SYNC;.   
28b90 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
28ba0 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
28bb0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
28bc0 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20  /* An error has 
28bd0 6f 63 63 75 72 72 65 64 20 77 72 69 74 69 6e 67  occurred writing
28be0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
28bf0 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20  file. The .     
28c00 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
28c10 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64  n will be rolled
28c20 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61 79   back by the lay
28c30 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20  er above..      
28c40 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
28c50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28c60 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
28c70 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
28c80 0a 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ..        pPager
28c90 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20  ->nRec++;.      
28ca0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
28cb0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->pInJournal!=0 
28cc0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
28cd0 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
28ce0 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
28cf0 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  nal, pPg->pgno);
28d00 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
28d10 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
28d20 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 61  MEM );.        a
28d30 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
28d40 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  E_OK || rc==SQLI
28d50 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
28d60 20 20 20 20 72 63 20 7c 3d 20 61 64 64 54 6f 53      rc |= addToS
28d70 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
28d80 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
28d90 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
28da0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
28db0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
28dc0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  t( rc==SQLITE_NO
28dd0 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 20  MEM );.         
28de0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
28df0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
28e00 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  e{.        if( !
28e10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
28e20 74 61 72 74 65 64 20 26 26 20 21 70 50 61 67 65  tarted && !pPage
28e30 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
28e40 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67         pPg->flag
28e50 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
28e60 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20  SYNC;.          
28e70 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
28e80 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
28e90 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
28ea0 43 45 28 28 22 41 50 50 45 4e 44 20 25 64 20 70  CE(("APPEND %d p
28eb0 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
28ec0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
28ed0 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
28ee0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
28ef0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
28f00 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50    ((pPg->flags&P
28f10 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f  GHDR_NEED_SYNC)?
28f20 31 3a 30 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a  1:0)));.      }.
28f30 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
28f40 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
28f50 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e   journal is open
28f60 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
28f70 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20   not in it,.    
28f80 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  ** then write th
28f90 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
28fa0 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  o the statement 
28fb0 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74  journal.  Note t
28fc0 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  hat.    ** the s
28fd0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
28fe0 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20   format differs 
28ff0 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72  from the standar
29000 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  d journal format
29010 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20  .    ** in that 
29020 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65  it omits the che
29030 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68  cksums and the h
29040 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  eader..    */.  
29050 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72    if( subjRequir
29060 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20  esPage(pPg) ){. 
29070 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75       rc = subjou
29080 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20  rnalPage(pPg);. 
29090 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55     }.  }..  /* U
290a0 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61  pdate the databa
290b0 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75  se size and retu
290c0 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  rn..  */.  asser
290d0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
290e0 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
290f0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
29100 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f  dbSize<pPg->pgno
29110 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
29120 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67  dbSize = pPg->pg
29130 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  no;.  }.  return
29140 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
29150 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61  rk a data page a
29160 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 69  s writeable. Thi
29170 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
29180 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
29190 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  .** making chang
291a0 65 73 20 74 6f 20 61 20 70 61 67 65 2e 20 54 68  es to a page. Th
291b0 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 68  e caller must ch
291c0 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 76  eck the return v
291d0 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73  alue .** of this
291e0 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65   function and be
291f0 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20   careful not to 
29200 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20  change any page 
29210 64 61 74 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20  data unless .** 
29220 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
29230 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
29240 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
29250 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
29260 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70  s function and p
29270 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20  ager_write() is 
29280 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e  that this.** fun
29290 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73  ction also deals
292a0 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61   with the specia
292b0 6c 20 63 61 73 65 20 77 68 65 72 65 20 32 20 6f  l case where 2 o
292c0 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20  r more pages.** 
292d0 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  fit on a single 
292e0 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20  disk sector. In 
292f0 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f  this case all co
29300 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a  -resident pages.
29310 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ** must have bee
29320 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
29330 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
29340 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
29350 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
29360 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45  r occurs, SQLITE
29370 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20  _NOMEM or an IO 
29380 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
29390 74 75 72 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70  turned.** as app
293a0 72 6f 70 72 69 61 74 65 2e 20 4f 74 68 65 72 77  ropriate. Otherw
293b0 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
293c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
293d0 67 65 72 57 72 69 74 65 28 44 62 50 61 67 65 20  gerWrite(DbPage 
293e0 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74  *pDbPage){.  int
293f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
29400 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  ..  PgHdr *pPg =
29410 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65   pDbPage;.  Page
29420 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
29430 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20  >pPager;.  Pgno 
29440 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d  nPagePerSector =
29450 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
29460 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67  Size/pPager->pag
29470 65 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 6e  eSize);..  if( n
29480 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20  PagePerSector>1 
29490 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  ){.    Pgno nPag
294a0 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20  eCount;         
294b0 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
294c0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
294d0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
294e0 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20    Pgno pg1;     
294f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
29500 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
29510 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c   sector pPg is l
29520 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20  ocated on. */.  
29530 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
29540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
29550 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
29560 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20 74  tarting at pg1 t
29570 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  o journal */.   
29580 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
29590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
295a0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
295b0 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d    int needSync =
295c0 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   0;         /* T
295d0 72 75 65 20 69 66 20 61 6e 79 20 70 61 67 65 20  rue if any page 
295e0 68 61 73 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  has PGHDR_NEED_S
295f0 59 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  YNC */..    /* S
29600 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63  et the doNotSync
29610 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73   flag to 1. This
29620 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20 63   is because we c
29630 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f  annot allow a jo
29640 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61  urnal.    ** hea
29650 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74 65  der to be writte
29660 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 61  n between the pa
29670 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79  ges journaled by
29680 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
29690 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
296a0 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
296b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
296c0 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b  >doNotSync==0 );
296d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
296e0 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20  otSync = 1;..   
296f0 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61   /* This trick a
29700 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68  ssumes that both
29710 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
29720 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61  nd sector-size a
29730 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74  re.    ** an int
29740 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e  eger power of 2.
29750 20 49 74 20 73 65 74 73 20 76 61 72 69 61 62 6c   It sets variabl
29760 65 20 70 67 31 20 74 6f 20 74 68 65 20 69 64 65  e pg1 to the ide
29770 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f  ntifier.    ** o
29780 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  f the first page
29790 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70   of the sector p
297a0 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e  Pg is located on
297b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31  ..    */.    pg1
297c0 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31   = ((pPg->pgno-1
297d0 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65  ) & ~(nPagePerSe
297e0 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20  ctor-1)) + 1;.. 
297f0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50     sqlite3PagerP
29800 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
29810 20 28 69 6e 74 20 2a 29 26 6e 50 61 67 65 43 6f   (int *)&nPageCo
29820 75 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50  unt);.    if( pP
29830 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75  g->pgno>nPageCou
29840 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67  nt ){.      nPag
29850 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d  e = (pPg->pgno -
29860 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c   pg1)+1;.    }el
29870 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67  se if( (pg1+nPag
29880 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50  ePerSector-1)>nP
29890 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  ageCount ){.    
298a0 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43    nPage = nPageC
298b0 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20  ount+1-pg1;.    
298c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61  }else{.      nPa
298d0 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63  ge = nPagePerSec
298e0 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  tor;.    }.    a
298f0 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a  ssert(nPage>0);.
29900 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d      assert(pg1<=
29910 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
29920 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67  assert((pg1+nPag
29930 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a  e)>pPg->pgno);..
29940 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
29950 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51  <nPage && rc==SQ
29960 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a  LITE_OK; ii++){.
29970 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20        Pgno pg = 
29980 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50 67  pg1+ii;.      Pg
29990 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  Hdr *pPage;.    
299a0 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70    if( pg==pPg->p
299b0 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33 42  gno || !sqlite3B
299c0 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
299d0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
299e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
299f0 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47   pg!=PAGER_MJ_PG
29a00 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
29a10 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
29a20 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
29a30 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29  ger, pg, &pPage)
29a40 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
29a50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
29a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
29a70 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  = pager_write(pP
29a80 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
29a90 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61    if( pPage->fla
29aa0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
29ab0 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NC ){.          
29ac0 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
29ad0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
29ae0 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
29af0 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20  eedSync);.      
29b00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29b10 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
29b20 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
29b30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29b40 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
29b50 69 66 28 20 28 70 50 61 67 65 20 3d 20 70 61 67  if( (pPage = pag
29b60 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
29b70 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20  , pg))!=0 ){.   
29b80 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
29b90 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
29ba0 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20  _SYNC ){.       
29bb0 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b     needSync = 1;
29bc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29bd0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
29be0 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
29bf0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
29c00 2f 2a 20 49 66 20 74 68 65 20 50 47 48 44 52 5f  /* If the PGHDR_
29c10 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69  NEED_SYNC flag i
29c20 73 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66  s set for any of
29c30 20 74 68 65 20 6e 50 61 67 65 20 70 61 67 65 73   the nPage pages
29c40 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e   .    ** startin
29c50 67 20 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69  g at pg1, then i
29c60 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65  t needs to be se
29c70 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  t for all of the
29c80 6d 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a  m. Because.    *
29c90 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79  * writing to any
29ca0 20 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65 20   of these nPage 
29cb0 70 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65  pages may damage
29cc0 20 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65   the others, the
29cd0 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
29ce0 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69  file must contai
29cf0 6e 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65  n sync()ed copie
29d00 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d  s of all of them
29d10 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61  .    ** before a
29d20 6e 79 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62  ny of them can b
29d30 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  e written out to
29d40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29d50 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
29d60 66 28 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  f( needSync ){. 
29d70 20 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45       assert( !ME
29d80 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 6e  MDB && pPager->n
29d90 6f 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  oSync==0 );.    
29da0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
29db0 50 61 67 65 20 26 26 20 6e 65 65 64 53 79 6e 63  Page && needSync
29dc0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
29dd0 20 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20   PgHdr *pPage = 
29de0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
29df0 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20  ger, pg1+ii);.  
29e00 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20        if( pPage 
29e10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  ){.          pPa
29e20 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  ge->flags |= PGH
29e30 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20  DR_NEED_SYNC;.  
29e40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
29e50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
29e60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
29e70 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
29e80 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e  (pPager->needSyn
29e90 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  c);.    }..    a
29ea0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
29eb0 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20  oNotSync==1 );. 
29ec0 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
29ed0 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Sync = 0;.  }els
29ee0 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  e{.    rc = page
29ef0 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65 29  r_write(pDbPage)
29f00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
29f10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
29f20 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70  rn TRUE if the p
29f30 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65  age given in the
29f40 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72   argument was pr
29f50 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a  eviously passed.
29f60 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ** to sqlite3Pag
29f70 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f  erWrite().  In o
29f80 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75  ther words, retu
29f90 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
29fa0 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65   ok.** to change
29fb0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
29fc0 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  the page..*/.#if
29fd0 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20  ndef NDEBUG.int 
29fe0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
29ff0 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a  iteable(DbPage *
2a000 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pPg){.  return p
2a010 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2a020 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a  DIRTY;.}.#endif.
2a030 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
2a040 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
2a050 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
2a060 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  at it is not nec
2a070 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69  essary to.** wri
2a080 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  te the informati
2a090 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62  on on page pPg b
2a0a0 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c  ack to the disk,
2a0b0 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20   even though.** 
2a0c0 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20  that page might 
2a0d0 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
2a0e0 74 79 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e  ty.  This happen
2a0f0 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s, for example, 
2a100 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  when.** the page
2a110 20 68 61 73 20 62 65 65 6e 20 61 64 64 65 64 20   has been added 
2a120 61 73 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65  as a leaf of the
2a130 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20 73 6f   freelist and so
2a140 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   its.** content 
2a150 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72  no longer matter
2a160 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65  s..**.** The ove
2a170 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20  rlying software 
2a180 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73  layer calls this
2a190 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c   routine when al
2a1a0 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a  l of the data.**
2a1b0 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
2a1c0 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 54 68  ge is unused. Th
2a1d0 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68  e pager marks th
2a1e0 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20  e page as clean 
2a1f0 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f  so.** that it do
2a200 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74  es not get writt
2a210 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  en to disk..**.*
2a220 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61  * Tests show tha
2a230 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  t this optimizat
2a240 69 6f 6e 20 63 61 6e 20 71 75 61 64 72 75 70 6c  ion can quadrupl
2a250 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c  e the speed of l
2a260 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45 54 45 20  arge .** DELETE 
2a270 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76  operations..*/.v
2a280 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
2a290 44 6f 6e 74 57 72 69 74 65 28 50 67 48 64 72 20  DontWrite(PgHdr 
2a2a0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
2a2b0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
2a2c0 61 67 65 72 3b 0a 20 20 69 66 28 20 28 70 50 67  ager;.  if( (pPg
2a2d0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
2a2e0 52 54 59 29 20 26 26 20 70 50 61 67 65 72 2d 3e  RTY) && pPager->
2a2f0 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b  nSavepoint==0 ){
2a300 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
2a310 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67  ("DONT_WRITE pag
2a320 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  e %d of %d\n", p
2a330 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49  Pg->pgno, PAGERI
2a340 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
2a350 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e   IOTRACE(("CLEAN
2a360 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
2a370 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20  r, pPg->pgno)). 
2a380 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
2a390 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54   PGHDR_DONT_WRIT
2a3a0 45 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  E;.#ifdef SQLITE
2a3b0 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
2a3c0 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
2a3d0 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
2a3e0 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  pPg);.#endif.  }
2a3f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2a400 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2a410 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68   to increment th
2a420 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64  e value of the d
2a430 61 74 61 62 61 73 65 20 66 69 6c 65 20 0a 2a 2a  atabase file .**
2a440 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c   change-counter,
2a450 20 73 74 6f 72 65 64 20 61 73 20 61 20 34 2d 62   stored as a 4-b
2a460 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
2a470 6e 74 65 67 65 72 20 73 74 61 72 74 69 6e 67 20  nteger starting 
2a480 61 74 20 0a 2a 2a 20 62 79 74 65 20 6f 66 66 73  at .** byte offs
2a490 65 74 20 32 34 20 6f 66 20 74 68 65 20 70 61 67  et 24 of the pag
2a4a0 65 72 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  er file..**.** I
2a4b0 66 20 74 68 65 20 69 73 44 69 72 65 63 74 20 66  f the isDirect f
2a4c0 6c 61 67 20 69 73 20 7a 65 72 6f 2c 20 74 68 65  lag is zero, the
2a4d0 6e 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62  n this is done b
2a4e0 79 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71  y calling .** sq
2a4f0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2a500 29 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65  ) on page 1, the
2a510 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  n modifying the 
2a520 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
2a530 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 20 49 6e  ** page data. In
2a540 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 66   this case the f
2a550 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 70 64 61  ile will be upda
2a560 74 65 64 20 77 68 65 6e 20 74 68 65 20 63 75 72  ted when the cur
2a570 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  rent.** transact
2a580 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
2a590 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 44 69  ..**.** The isDi
2a5a0 72 65 63 74 20 66 6c 61 67 20 6d 61 79 20 6f 6e  rect flag may on
2a5b0 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69  ly be non-zero i
2a5c0 66 20 74 68 65 20 6c 69 62 72 61 72 79 20 77 61  f the library wa
2a5d0 73 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77 69  s compiled.** wi
2a5e0 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e  th the SQLITE_EN
2a5f0 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
2a600 45 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e  E macro defined.
2a610 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 2a   In this case,.*
2a620 2a 20 69 66 20 69 73 44 69 72 65 63 74 20 69 73  * if isDirect is
2a630 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
2a640 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a650 65 20 69 73 20 75 70 64 61 74 65 64 20 64 69 72  e is updated dir
2a660 65 63 74 6c 79 0a 2a 2a 20 62 79 20 77 72 69 74  ectly.** by writ
2a670 69 6e 67 20 61 6e 20 75 70 64 61 74 65 64 20 76  ing an updated v
2a680 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31  ersion of page 1
2a690 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f   using a call to
2a6a0 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33   the .** sqlite3
2a6b0 4f 73 57 72 69 74 65 28 29 20 66 75 6e 63 74 69  OsWrite() functi
2a6c0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
2a6d0 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  t pager_incr_cha
2a6e0 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72  ngecounter(Pager
2a6f0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73   *pPager, int is
2a700 44 69 72 65 63 74 4d 6f 64 65 29 7b 0a 20 20 69  DirectMode){.  i
2a710 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2a720 4b 3b 0a 0a 20 20 2f 2a 20 44 65 63 6c 61 72 65  K;..  /* Declare
2a730 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
2a740 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72  constant integer
2a750 20 27 69 73 44 69 72 65 63 74 27 2e 20 49 66 20   'isDirect'. If 
2a760 74 68 65 0a 20 20 2a 2a 20 61 74 6f 6d 69 63 2d  the.  ** atomic-
2a770 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
2a780 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 69 6e  on is enabled in
2a790 20 74 68 69 73 20 62 75 69 6c 64 2c 20 74 68 65   this build, the
2a7a0 6e 20 69 73 44 69 72 65 63 74 0a 20 20 2a 2a 20  n isDirect.  ** 
2a7b0 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
2a7c0 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73  o the value pass
2a7d0 65 64 20 61 73 20 74 68 65 20 69 73 44 69 72 65  ed as the isDire
2a7e0 63 74 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72  ctMode parameter
2a7f0 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 66 75  .  ** to this fu
2a800 6e 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73  nction. Otherwis
2a810 65 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73 20  e, it is always 
2a820 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a  set to zero..  *
2a830 2a 0a 20 20 2a 2a 20 54 68 65 20 69 64 65 61 20  *.  ** The idea 
2a840 69 73 20 74 68 61 74 20 69 66 20 74 68 65 20 61  is that if the a
2a850 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
2a860 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6e 6f 74 0a  mization is not.
2a870 20 20 2a 2a 20 65 6e 61 62 6c 65 64 20 61 74 20    ** enabled at 
2a880 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68  compile time, th
2a890 65 20 63 6f 6d 70 69 6c 65 72 20 63 61 6e 20 6f  e compiler can o
2a8a0 6d 69 74 20 74 68 65 20 74 65 73 74 73 20 6f 66  mit the tests of
2a8b0 0a 20 20 2a 2a 20 27 69 73 44 69 72 65 63 74 27  .  ** 'isDirect'
2a8c0 20 62 65 6c 6f 77 2c 20 61 73 20 77 65 6c 6c 20   below, as well 
2a8d0 61 73 20 74 68 65 20 62 6c 6f 63 6b 20 65 6e 63  as the block enc
2a8e0 6c 6f 73 65 64 20 69 6e 20 74 68 65 0a 20 20 2a  losed in the.  *
2a8f0 2a 20 22 69 66 28 20 69 73 44 69 72 65 63 74 20  * "if( isDirect 
2a900 29 22 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20  )" condition..  
2a910 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2a920 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
2a930 57 52 49 54 45 0a 20 20 63 6f 6e 73 74 20 69 6e  WRITE.  const in
2a940 74 20 69 73 44 69 72 65 63 74 20 3d 20 30 3b 0a  t isDirect = 0;.
2a950 20 20 61 73 73 65 72 74 28 20 69 73 44 69 72 65    assert( isDire
2a960 63 74 4d 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 55  ctMode==0 );.  U
2a970 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2a980 69 73 44 69 72 65 63 74 4d 6f 64 65 29 3b 0a 23  isDirectMode);.#
2a990 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74  else.  const int
2a9a0 20 69 73 44 69 72 65 63 74 20 3d 20 69 73 44 69   isDirect = isDi
2a9b0 72 65 63 74 4d 6f 64 65 3b 0a 23 65 6e 64 69 66  rectMode;.#endif
2a9c0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
2a9d0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
2a9e0 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 69  _RESERVED );.  i
2a9f0 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e  f( !pPager->chan
2aa00 67 65 43 6f 75 6e 74 44 6f 6e 65 20 26 26 20 70  geCountDone && p
2aa10 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20  Pager->dbSize>0 
2aa20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  ){.    PgHdr *pP
2aa30 67 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  gHdr;           
2aa40 20 20 20 20 20 2f 2a 20 52 65 66 65 72 65 6e 63       /* Referenc
2aa50 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20  e to page 1 */. 
2aa60 20 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f     u32 change_co
2aa70 75 6e 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  unter;          
2aa80 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75   /* Initial valu
2aa90 65 20 6f 66 20 63 68 61 6e 67 65 2d 63 6f 75 6e  e of change-coun
2aaa0 74 65 72 20 66 69 65 6c 64 20 2a 2f 0a 0a 20 20  ter field */..  
2aab0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
2aac0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 69  r->tempFile && i
2aad0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
2aae0 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65  ) );..    /* Ope
2aaf0 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20  n page 1 of the 
2ab00 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67  file for writing
2ab10 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
2ab20 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
2ab30 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72  ager, 1, &pPgHdr
2ab40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2ab50 50 67 48 64 72 3d 3d 30 20 7c 7c 20 72 63 3d 3d  PgHdr==0 || rc==
2ab60 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
2ab70 20 20 2f 2a 20 49 66 20 70 61 67 65 20 6f 6e 65    /* If page one
2ab80 20 77 61 73 20 66 65 74 63 68 65 64 20 73 75 63   was fetched suc
2ab90 63 65 73 73 66 75 6c 6c 79 2c 20 61 6e 64 20 74  cessfully, and t
2aba0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2abb0 6e 6f 74 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  not.    ** opera
2abc0 74 69 6e 67 20 69 6e 20 64 69 72 65 63 74 2d 6d  ting in direct-m
2abd0 6f 64 65 2c 20 6d 61 6b 65 20 70 61 67 65 20 31  ode, make page 1
2abe0 20 77 72 69 74 61 62 6c 65 2e 0a 20 20 20 20 2a   writable..    *
2abf0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
2ac00 4c 49 54 45 5f 4f 4b 20 26 26 20 21 69 73 44 69  LITE_OK && !isDi
2ac10 72 65 63 74 20 29 7b 0a 20 20 20 20 20 20 72 63  rect ){.      rc
2ac20 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2ac30 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20  rite(pPgHdr);.  
2ac40 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
2ac50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ac60 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74      /* Increment
2ac70 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20   the value just 
2ac80 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69  read and write i
2ac90 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32  t back to byte 2
2aca0 34 2e 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 6e  4. */.      chan
2acb0 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c  ge_counter = sql
2acc0 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75 38  ite3Get4byte((u8
2acd0 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  *)pPager->dbFile
2ace0 56 65 72 73 29 3b 0a 20 20 20 20 20 20 63 68 61  Vers);.      cha
2acf0 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  nge_counter++;. 
2ad00 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 28       put32bits((
2ad10 28 63 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70  (char*)pPgHdr->p
2ad20 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65  Data)+24, change
2ad30 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20  _counter);..    
2ad40 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20    /* If running 
2ad50 69 6e 20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20  in direct mode, 
2ad60 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  write the conten
2ad70 74 73 20 6f 66 20 70 61 67 65 20 31 20 74 6f 20  ts of page 1 to 
2ad80 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  the file. */.   
2ad90 20 20 20 69 66 28 20 69 73 44 69 72 65 63 74 20     if( isDirect 
2ada0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
2adb0 20 76 6f 69 64 20 2a 7a 42 75 66 20 3d 20 70 50   void *zBuf = pP
2adc0 67 48 64 72 2d 3e 70 44 61 74 61 3b 0a 20 20 20  gHdr->pData;.   
2add0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
2ade0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e  ger->dbFileSize>
2adf0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
2ae00 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
2ae10 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75  (pPager->fd, zBu
2ae20 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
2ae30 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ize, 0);.      }
2ae40 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 65 76  ..      /* If ev
2ae50 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c  erything worked,
2ae60 20 73 65 74 20 74 68 65 20 63 68 61 6e 67 65 43   set the changeC
2ae70 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 2e 20 2a  ountDone flag. *
2ae80 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  /.      if( rc==
2ae90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2aea0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61       pPager->cha
2aeb0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31  ngeCountDone = 1
2aec0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2aed0 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
2aee0 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65 6e  the page referen
2aef0 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ce. */.    sqlit
2af00 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
2af10 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Hdr);.  }.  retu
2af20 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2af30 53 79 6e 63 20 74 68 65 20 70 61 67 65 72 20 66  Sync the pager f
2af40 69 6c 65 20 74 6f 20 64 69 73 6b 2e 20 54 68 69  ile to disk. Thi
2af50 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  s is a no-op for
2af60 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73   in-memory files
2af70 0a 2a 2a 20 6f 72 20 70 61 67 65 73 20 77 69 74  .** or pages wit
2af80 68 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79  h the Pager.noSy
2af90 6e 63 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a  nc flag set..**.
2afa0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
2afb0 2c 20 6f 72 20 63 61 6c 6c 65 64 20 6f 6e 20 61  , or called on a
2afc0 20 70 61 67 65 72 20 66 6f 72 20 77 68 69 63 68   pager for which
2afd0 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20   it is a no-op, 
2afe0 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
2aff0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
2b000 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  OK. Otherwise, a
2b010 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
2b020 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
2b030 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2b040 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67  Sync(Pager *pPag
2b050 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
2b060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2b080 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2b090 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70 50 61  if( MEMDB || pPa
2b0a0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
2b0b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2b0c0 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
2b0d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
2b0e0 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  nc(pPager->fd, p
2b0f0 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
2b100 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  s);.  }.  return
2b110 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79   rc;.}../*.** Sy
2b120 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
2b130 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67  file for the pag
2b140 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74  er pPager. zMast
2b150 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  er points to the
2b160 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61   name.** of a ma
2b170 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
2b180 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
2b190 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
2b1a0 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20  e individual.** 
2b1b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d  journal file. zM
2b1c0 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c  aster may be NUL
2b1d0 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65  L, which is inte
2b1e0 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61  rpreted as no ma
2b1f0 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
2b200 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61  (a single databa
2b210 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  se transaction).
2b220 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2b230 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74  ine ensures that
2b240 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
2b250 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
2b260 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20  ange-counter is 
2b270 75 70 64 61 74 65 64 2c 0a 2a 2a 20 20 20 2a 20  updated,.**   * 
2b280 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
2b290 79 6e 63 65 64 20 28 75 6e 6c 65 73 73 20 74 68  ynced (unless th
2b2a0 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
2b2b0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75  ptimization is u
2b2c0 73 65 64 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c  sed),.**   * all
2b2d0 20 64 69 72 74 79 20 70 61 67 65 73 20 61 72 65   dirty pages are
2b2e0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2b2f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 0a  database file, .
2b300 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62  **   * the datab
2b310 61 73 65 20 66 69 6c 65 20 69 73 20 74 72 75 6e  ase file is trun
2b320 63 61 74 65 64 20 28 69 66 20 72 65 71 75 69 72  cated (if requir
2b330 65 64 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ed), and.**   * 
2b340 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2b350 65 20 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a  e synced. .**.**
2b360 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   The only thing 
2b370 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20  that remains to 
2b380 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
2b390 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 66 69 6e  action is to fin
2b3a0 61 6c 69 7a 65 20 0a 2a 2a 20 28 64 65 6c 65 74  alize .** (delet
2b3b0 65 2c 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a  e, truncate or z
2b3c0 65 72 6f 20 74 68 65 20 66 69 72 73 74 20 70 61  ero the first pa
2b3d0 72 74 20 6f 66 29 20 74 68 65 20 6a 6f 75 72 6e  rt of) the journ
2b3e0 61 6c 20 66 69 6c 65 20 28 6f 72 20 0a 2a 2a 20  al file (or .** 
2b3f0 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
2b400 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
2b410 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a  f specified)..**
2b420 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66  .** Note that if
2b430 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20   zMaster==NULL, 
2b440 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76  this does not ov
2b450 65 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f  erwrite a previo
2b460 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73  us value.** pass
2b470 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  ed to an sqlite3
2b480 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
2b490 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a  One() call..**.*
2b4a0 2a 20 49 66 20 74 68 65 20 66 69 6e 61 6c 20 70  * If the final p
2b4b0 61 72 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e  arameter - noSyn
2b4c0 63 20 2d 20 69 73 20 74 72 75 65 2c 20 74 68 65  c - is true, the
2b4d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2b4e0 69 6c 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73  ile itself.** is
2b4f0 20 6e 6f 74 20 73 79 6e 63 65 64 2e 20 54 68 65   not synced. The
2b500 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c   caller must cal
2b510 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  l sqlite3PagerSy
2b520 6e 63 28 29 20 64 69 72 65 63 74 6c 79 20 74 6f  nc() directly to
2b530 0a 2a 2a 20 73 79 6e 63 20 74 68 65 20 64 61 74  .** sync the dat
2b540 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
2b550 65 20 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74  e calling Commit
2b560 50 68 61 73 65 54 77 6f 28 29 20 74 6f 20 64 65  PhaseTwo() to de
2b570 6c 65 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  lete the.** jour
2b580 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 69 73  nal file in this
2b590 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   case..*/.int sq
2b5a0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
2b5b0 50 68 61 73 65 4f 6e 65 28 0a 20 20 50 61 67 65  PhaseOne(.  Page
2b5c0 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
2b5d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2b5e0 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
2b5f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
2b600 73 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ster,           
2b610 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c   /* If not NULL,
2b620 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
2b630 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  nal name */.  in
2b640 74 20 6e 6f 53 79 6e 63 20 20 20 20 20 20 20 20  t noSync        
2b650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b660 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 74 68   True to omit th
2b670 65 20 78 53 79 6e 63 20 6f 6e 20 74 68 65 20 64  e xSync on the d
2b680 62 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69  b file */.){.  i
2b690 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2b6a0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
2b6b0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2b6c0 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
2b6d0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
2b6e0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
2b6f0 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 50 41  rCode;.  }..  PA
2b700 47 45 52 54 52 41 43 45 28 28 22 44 41 54 41 42  GERTRACE(("DATAB
2b710 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25  ASE SYNC: File=%
2b720 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 53 69  s zMaster=%s nSi
2b730 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  ze=%d\n", .     
2b740 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2b750 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  me, zMaster, pPa
2b760 67 65 72 2d 3e 64 62 53 69 7a 65 29 29 3b 0a 0a  ger->dbSize));..
2b770 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
2b780 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c  an in-memory db,
2b790 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76   or no pages hav
2b7a0 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
2b7b0 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20  o, or this.  ** 
2b7c0 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  function has alr
2b7d0 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
2b7e0 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
2b7f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44  .  */.  if( MEMD
2b800 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 4d  B && pPager->dbM
2b810 6f 64 69 66 69 65 64 20 29 7b 0a 20 20 20 20 73  odified ){.    s
2b820 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
2b830 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
2b840 6b 75 70 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  kup);.  }else if
2b850 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
2b860 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26  =PAGER_SYNCED &&
2b870 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
2b880 69 65 64 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 54  ied ){..    /* T
2b890 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
2b8a0 63 6b 20 75 70 64 61 74 65 73 20 74 68 65 20 63  ck updates the c
2b8b0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 45  hange-counter. E
2b8c0 78 61 63 74 6c 79 20 68 6f 77 20 69 74 0a 20 20  xactly how it.  
2b8d0 20 20 2a 2a 20 64 6f 65 73 20 74 68 69 73 20 64    ** does this d
2b8e0 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65  epends on whethe
2b8f0 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f  r or not the ato
2b900 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d  mic-update optim
2b910 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 77  ization.    ** w
2b920 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  as enabled at co
2b930 6d 70 69 6c 65 20 74 69 6d 65 2c 20 61 6e 64 20  mpile time, and 
2b940 69 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  if this transact
2b950 69 6f 6e 20 6d 65 65 74 73 20 74 68 65 20 0a 20  ion meets the . 
2b960 20 20 20 2a 2a 20 72 75 6e 74 69 6d 65 20 63 72     ** runtime cr
2b970 69 74 65 72 69 61 20 74 6f 20 75 73 65 20 74 68  iteria to use th
2b980 65 20 6f 70 65 72 61 74 69 6f 6e 3a 20 0a 20 20  e operation: .  
2b990 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2a    **.    **    *
2b9a0 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   The file-system
2b9b0 20 73 75 70 70 6f 72 74 73 20 74 68 65 20 61 74   supports the at
2b9c0 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65  omic-write prope
2b9d0 72 74 79 20 66 6f 72 0a 20 20 20 20 2a 2a 20 20  rty for.    **  
2b9e0 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69      blocks of si
2b9f0 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e  ze page-size, an
2ba00 64 20 0a 20 20 20 20 2a 2a 20 20 20 20 2a 20 54  d .    **    * T
2ba10 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f  his commit is no
2ba20 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74  t part of a mult
2ba30 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69  i-file transacti
2ba40 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20  on, and.    **  
2ba50 20 20 2a 20 45 78 61 63 74 6c 79 20 6f 6e 65 20    * Exactly one 
2ba60 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  page has been mo
2ba70 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f 72 65  dified and store
2ba80 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
2ba90 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
2baa0 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d   ** If the optim
2bab0 69 7a 61 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20  ization was not 
2bac0 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
2bad0 6c 65 20 74 69 6d 65 2c 20 74 68 65 6e 20 74 68  le time, then th
2bae0 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 69  e.    ** pager_i
2baf0 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
2bb00 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  r() function is 
2bb10 63 61 6c 6c 65 64 20 74 6f 20 75 70 64 61 74 65  called to update
2bb20 20 74 68 65 20 63 68 61 6e 67 65 0a 20 20 20 20   the change.    
2bb30 2a 2a 20 63 6f 75 6e 74 65 72 20 69 6e 20 27 69  ** counter in 'i
2bb40 6e 64 69 72 65 63 74 2d 6d 6f 64 65 27 2e 20 49  ndirect-mode'. I
2bb50 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
2bb60 6f 6e 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 69  on is compiled i
2bb70 6e 20 62 75 74 0a 20 20 20 20 2a 2a 20 69 73 20  n but.    ** is 
2bb80 6e 6f 74 20 61 70 70 6c 69 63 61 62 6c 65 20 74  not applicable t
2bb90 6f 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  o this transacti
2bba0 6f 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  on, call sqlite3
2bbb0 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 29 0a  JournalCreate().
2bbc0 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 73      ** to make s
2bbd0 75 72 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ure the journal 
2bbe0 66 69 6c 65 20 68 61 73 20 61 63 74 75 61 6c 6c  file has actuall
2bbf0 79 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20  y been created, 
2bc00 74 68 65 6e 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  then call.    **
2bc10 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
2bc20 67 65 63 6f 75 6e 74 65 72 28 29 20 74 6f 20 75  gecounter() to u
2bc30 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
2bc40 2d 63 6f 75 6e 74 65 72 20 69 6e 20 69 6e 64 69  -counter in indi
2bc50 72 65 63 74 0a 20 20 20 20 2a 2a 20 6d 6f 64 65  rect.    ** mode
2bc60 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
2bc70 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
2bc80 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
2bc90 69 73 20 62 6f 74 68 20 65 6e 61 62 6c 65 64 20  is both enabled 
2bca0 61 6e 64 20 61 70 70 6c 69 63 61 62 6c 65 2c 0a  and applicable,.
2bcb0 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 61 6c 6c      ** then call
2bcc0 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
2bcd0 67 65 63 6f 75 6e 74 65 72 28 29 20 74 6f 20 75  gecounter() to u
2bce0 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
2bcf0 2d 63 6f 75 6e 74 65 72 0a 20 20 20 20 2a 2a 20  -counter.    ** 
2bd00 69 6e 20 27 64 69 72 65 63 74 27 20 6d 6f 64 65  in 'direct' mode
2bd10 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
2bd20 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2bd30 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 0a 20 20  will never be.  
2bd40 20 20 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72    ** created for
2bd50 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
2bd60 6e 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 64 65 66  n..    */.#ifdef
2bd70 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
2bd80 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
2bd90 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20  PgHdr *pPg;.    
2bda0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
2bdb0 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70  Pager->jfd) || p
2bdc0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2bdd0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
2bde0 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20 20 20  LMODE_OFF );.   
2bdf0 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 26 26   if( !zMaster &&
2be00 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2be10 6a 66 64 29 20 0a 20 20 20 20 20 26 26 20 70 50  jfd) .     && pP
2be20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2be30 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  ==jrnlBufferSize
2be40 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20 26  (pPager) .     &
2be50 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  & pPager->dbSize
2be60 3e 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  >=pPager->dbFile
2be70 53 69 7a 65 0a 20 20 20 20 20 26 26 20 28 30 3d  Size.     && (0=
2be80 3d 28 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50  =(pPg = sqlite3P
2be90 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
2bea0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29  Pager->pPCache))
2beb0 20 7c 7c 20 30 3d 3d 70 50 67 2d 3e 70 44 69 72   || 0==pPg->pDir
2bec0 74 79 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ty).    ){.     
2bed0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64   /* Update the d
2bee0 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f  b file change co
2bef0 75 6e 74 65 72 20 76 69 61 20 74 68 65 20 64 69  unter via the di
2bf00 72 65 63 74 2d 77 72 69 74 65 20 6d 65 74 68 6f  rect-write metho
2bf10 64 2e 20 54 68 65 20 0a 20 20 20 20 20 20 2a 2a  d. The .      **
2bf20 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20   following call 
2bf30 77 69 6c 6c 20 6d 6f 64 69 66 79 20 74 68 65 20  will modify the 
2bf40 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
2bf50 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61 67 65  entation of page
2bf60 20 31 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20   1 .      ** to 
2bf70 69 6e 63 6c 75 64 65 20 74 68 65 20 75 70 64 61  include the upda
2bf80 74 65 64 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  ted change count
2bf90 65 72 20 61 6e 64 20 74 68 65 6e 20 77 72 69 74  er and then writ
2bfa0 65 20 70 61 67 65 20 31 20 0a 20 20 20 20 20 20  e page 1 .      
2bfb0 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74  ** directly to t
2bfc0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2bfd0 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74 68 65  . Because of the
2bfe0 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 0a 20   atomic-write . 
2bff0 20 20 20 20 20 2a 2a 20 70 72 6f 70 65 72 74 79       ** property
2c000 20 6f 66 20 74 68 65 20 68 6f 73 74 20 66 69 6c   of the host fil
2c010 65 2d 73 79 73 74 65 6d 2c 20 74 68 69 73 20 69  e-system, this i
2c020 73 20 73 61 66 65 2e 0a 20 20 20 20 20 20 2a 2f  s safe..      */
2c030 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2c040 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
2c050 6e 74 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b  nter(pPager, 1);
2c060 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2c070 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
2c080 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61 67  urnalCreate(pPag
2c090 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
2c0a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2c0b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
2c0c0 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  = pager_incr_cha
2c0d0 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65  ngecounter(pPage
2c0e0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r, 0);.      }. 
2c0f0 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 72     }.#else.    r
2c100 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
2c110 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
2c120 67 65 72 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  ger, 0);.#endif.
2c130 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2c140 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
2c150 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
2c160 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  it;..    /* If t
2c170 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  his transaction 
2c180 68 61 73 20 6d 61 64 65 20 74 68 65 20 64 61 74  has made the dat
2c190 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74  abase smaller, t
2c1a0 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20  hen all pages.  
2c1b0 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61    ** being disca
2c1c0 72 64 65 64 20 62 79 20 74 68 65 20 74 72 75 6e  rded by the trun
2c1d0 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77  cation must be w
2c1e0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
2c1f0 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
2c200 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e. This can only
2c210 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d   happen in auto-
2c220 76 61 63 75 75 6d 20 6d 6f 64 65 2e 0a 20 20 20  vacuum mode..   
2c230 20 2a 2a 0a 20 20 20 20 2a 2a 20 42 65 66 6f 72   **.    ** Befor
2c240 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 70 61  e reading the pa
2c250 67 65 73 20 77 69 74 68 20 70 61 67 65 20 6e 75  ges with page nu
2c260 6d 62 65 72 73 20 6c 61 72 67 65 72 20 74 68 61  mbers larger tha
2c270 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 75  n the .    ** cu
2c280 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50  rrent value of P
2c290 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 73 65 74  ager.dbSize, set
2c2a0 20 64 62 53 69 7a 65 20 62 61 63 6b 20 74 6f 20   dbSize back to 
2c2b0 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a  the value.    **
2c2c0 20 74 68 61 74 20 69 74 20 74 6f 6f 6b 20 61 74   that it took at
2c2d0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
2c2e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4f  e transaction. O
2c2f0 74 68 65 72 77 69 73 65 2c 20 74 68 65 0a 20 20  therwise, the.  
2c300 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71    ** calls to sq
2c310 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
2c320 72 65 74 75 72 6e 20 7a 65 72 6f 65 64 20 70 61  return zeroed pa
2c330 67 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 0a  ges instead of .
2c340 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 64      ** reading d
2c350 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ata from the dat
2c360 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
2c370 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2c380 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2c390 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  M.    if( pPager
2c3a0 2d 3e 64 62 53 69 7a 65 3c 70 50 61 67 65 72 2d  ->dbSize<pPager-
2c3b0 3e 64 62 4f 72 69 67 53 69 7a 65 0a 20 20 20 20  >dbOrigSize.    
2c3c0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
2c3d0 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
2c3e0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
2c3f0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 50 67 6e      ){.      Pgn
2c400 6f 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  o i;            
2c410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c420 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
2c430 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
2c440 20 20 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20       const Pgno 
2c450 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a  iSkip = PAGER_MJ
2c460 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b 20 2f  _PGNO(pPager); /
2c470 2a 20 50 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 70  * Pending lock p
2c480 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  age */.      con
2c490 73 74 20 50 67 6e 6f 20 64 62 53 69 7a 65 20 3d  st Pgno dbSize =
2c4a0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
2c4b0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
2c4c0 73 65 20 69 6d 61 67 65 20 73 69 7a 65 20 2a 2f  se image size */
2c4d0 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e   .      pPager->
2c4e0 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
2c4f0 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 20  >dbOrigSize;.   
2c500 20 20 20 66 6f 72 28 20 69 3d 64 62 53 69 7a 65     for( i=dbSize
2c510 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 64  +1; i<=pPager->d
2c520 62 4f 72 69 67 53 69 7a 65 3b 20 69 2b 2b 20 29  bOrigSize; i++ )
2c530 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73  {.        if( !s
2c540 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
2c550 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
2c560 6e 61 6c 2c 20 69 29 20 26 26 20 69 21 3d 69 53  nal, i) && i!=iS
2c570 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  kip ){.         
2c580 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 20 20   PgHdr *pPage;  
2c590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2c5a0 67 65 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f  ge to journal */
2c5b0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2c5c0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
2c5d0 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 61 67  pPager, i, &pPag
2c5e0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
2c5f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c600 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68  ) goto commit_ph
2c610 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20  ase_one_exit;.  
2c620 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2c630 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2c640 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2c650 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
2c660 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
2c670 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2c680 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f  ITE_OK ) goto co
2c690 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
2c6a0 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xit;.        }. 
2c6b0 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 70 50       } .      pP
2c6c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 64  ager->dbSize = d
2c6d0 62 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 23 65 6e  bSize;.    }.#en
2c6e0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74  dif..    /* Writ
2c6f0 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
2c700 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74  rnal name into t
2c710 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
2c720 20 49 66 20 61 20 6d 61 73 74 65 72 20 0a 20 20   If a master .  
2c730 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
2c740 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61  e name has alrea
2c750 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
2c760 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
2c770 69 6c 65 2c 20 0a 20 20 20 20 2a 2a 20 6f 72 20  ile, .    ** or 
2c780 69 66 20 7a 4d 61 73 74 65 72 20 69 73 20 4e 55  if zMaster is NU
2c790 4c 4c 20 28 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  LL (no master jo
2c7a0 75 72 6e 61 6c 29 2c 20 74 68 65 6e 20 74 68 69  urnal), then thi
2c7b0 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
2c7c0 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  p..    */.    rc
2c7d0 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f   = writeMasterJo
2c7e0 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d  urnal(pPager, zM
2c7f0 61 73 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20  aster);.    if( 
2c800 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2c810 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73  goto commit_phas
2c820 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20 20 20  e_one_exit;..   
2c830 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75   /* Sync the jou
2c840 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68  rnal file. If th
2c850 65 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20  e atomic-update 
2c860 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
2c870 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20 75 73 65  being.    ** use
2c880 64 2c 20 74 68 69 73 20 63 61 6c 6c 20 77 69 6c  d, this call wil
2c890 6c 20 6e 6f 74 20 63 72 65 61 74 65 20 74 68 65  l not create the
2c8a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
2c8b0 20 70 65 72 66 6f 72 6d 20 61 6e 79 0a 20 20 20   perform any.   
2c8c0 20 2a 2a 20 72 65 61 6c 20 49 4f 2e 0a 20 20 20   ** real IO..   
2c8d0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 79 6e   */.    rc = syn
2c8e0 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
2c8f0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2c900 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63  LITE_OK ) goto c
2c910 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
2c920 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 57 72  exit;..    /* Wr
2c930 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ite all dirty pa
2c940 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
2c950 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
2c960 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
2c970 65 5f 70 61 67 65 6c 69 73 74 28 73 71 6c 69 74  e_pagelist(sqlit
2c980 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73  e3PcacheDirtyLis
2c990 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
2c9a0 65 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  e));.    if( rc!
2c9b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c9c0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
2c9d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
2c9e0 43 4b 45 44 20 29 3b 0a 20 20 20 20 20 20 67 6f  CKED );.      go
2c9f0 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
2ca00 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  one_exit;.    }.
2ca10 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
2ca20 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72  eCleanAll(pPager
2ca30 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 20  ->pPCache);..   
2ca40 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
2ca50 6f 6e 20 64 69 73 6b 20 69 73 20 6e 6f 74 20 74  on disk is not t
2ca60 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20  he same size as 
2ca70 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
2ca80 67 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ge,.    ** then 
2ca90 75 73 65 20 70 61 67 65 72 5f 74 72 75 6e 63 61  use pager_trunca
2caa0 74 65 20 74 6f 20 67 72 6f 77 20 6f 72 20 73 68  te to grow or sh
2cab0 72 69 6e 6b 20 74 68 65 20 66 69 6c 65 20 68 65  rink the file he
2cac0 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  re..    */.    i
2cad0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
2cae0 65 21 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e!=pPager->dbFil
2caf0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 50  eSize ){.      P
2cb00 67 6e 6f 20 6e 4e 65 77 20 3d 20 70 50 61 67 65  gno nNew = pPage
2cb10 72 2d 3e 64 62 53 69 7a 65 20 2d 20 28 70 50 61  r->dbSize - (pPa
2cb20 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 41 47  ger->dbSize==PAG
2cb30 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
2cb40 72 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r));.      asser
2cb50 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
2cb60 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
2cb70 45 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  E );.      rc = 
2cb80 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
2cb90 50 61 67 65 72 2c 20 6e 4e 65 77 29 3b 0a 20 20  Pager, nNew);.  
2cba0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2cbb0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
2cbc0 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
2cbd0 69 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  it;.    }..    /
2cbe0 2a 20 46 69 6e 61 6c 6c 79 2c 20 73 79 6e 63 20  * Finally, sync 
2cbf0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2cc00 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70  e. */.    if( !p
2cc10 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26  Pager->noSync &&
2cc20 20 21 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20   !noSync ){.    
2cc30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2cc40 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c  Sync(pPager->fd,
2cc50 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
2cc60 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ags);.    }.    
2cc70 49 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e 43  IOTRACE(("DBSYNC
2cc80 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
2cc90 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ..    pPager->st
2cca0 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43  ate = PAGER_SYNC
2ccb0 45 44 3b 0a 20 20 7d 0a 0a 63 6f 6d 6d 69 74 5f  ED;.  }..commit_
2ccc0 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3a 0a  phase_one_exit:.
2ccd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2cce0 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29  _IOERR_BLOCKED )
2ccf0 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 69  {.    /* pager_i
2cd00 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
2cd10 72 28 29 20 6d 61 79 20 61 74 74 65 6d 70 74 20  r() may attempt 
2cd20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63  to obtain an exc
2cd30 6c 75 73 69 76 65 0a 20 20 20 20 2a 2a 20 6c 6f  lusive.    ** lo
2cd40 63 6b 20 74 6f 20 73 70 69 6c 6c 20 74 68 65 20  ck to spill the 
2cd50 63 61 63 68 65 20 61 6e 64 20 72 65 74 75 72 6e  cache and return
2cd60 20 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 2e 20   IOERR_BLOCKED. 
2cd70 42 75 74 20 73 69 6e 63 65 20 0a 20 20 20 20 2a  But since .    *
2cd80 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  * there is no ch
2cd90 61 6e 63 65 20 74 68 65 20 63 61 63 68 65 20 69  ance the cache i
2cda0 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 2c 20  s inconsistent, 
2cdb0 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 62 65 74  it is.    ** bet
2cdc0 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20 53 51  ter to return SQ
2cdd0 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a  LITE_BUSY..    *
2cde0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
2cdf0 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 72  TE_BUSY;.  }.  r
2ce00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
2ce10 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
2ce20 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2ce30 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
2ce40 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6d  ile has been com
2ce50 70 6c 65 74 65 6c 79 0a 2a 2a 20 75 70 64 61 74  pletely.** updat
2ce60 65 64 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68  ed to reflect th
2ce70 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  e changes made b
2ce80 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  y the current tr
2ce90 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a  ansaction and.**
2cea0 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
2ceb0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
2cec0 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 69  e still exists i
2ced0 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
2cee0 6d 20 0a 2a 2a 20 74 68 6f 75 67 68 2c 20 61 6e  m .** though, an
2cef0 64 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  d if a failure o
2cf00 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f  ccurs at this po
2cf10 69 6e 74 20 69 74 20 77 69 6c 6c 20 65 76 65 6e  int it will even
2cf20 74 75 61 6c 6c 79 0a 2a 2a 20 62 65 20 75 73 65  tually.** be use
2cf30 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  d as a hot-journ
2cf40 61 6c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  al and the curre
2cf50 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  nt transaction r
2cf60 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
2cf70 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2cf80 66 69 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f  finalizes the jo
2cf90 75 72 6e 61 6c 20 66 69 6c 65 2c 20 65 69 74 68  urnal file, eith
2cfa0 65 72 20 62 79 20 64 65 6c 65 74 69 6e 67 2c 20  er by deleting, 
2cfb0 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6e 67 20 6f  .** truncating o
2cfc0 72 20 70 61 72 74 69 61 6c 6c 79 20 7a 65 72 6f  r partially zero
2cfd0 69 6e 67 20 69 74 2c 20 73 6f 20 74 68 61 74 20  ing it, so that 
2cfe0 69 74 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  it cannot be use
2cff0 64 20 0a 2a 2a 20 66 6f 72 20 68 6f 74 2d 6a 6f  d .** for hot-jo
2d000 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20  urnal rollback. 
2d010 4f 6e 63 65 20 74 68 69 73 20 69 73 20 64 6f 6e  Once this is don
2d020 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
2d030 6e 20 69 73 0a 2a 2a 20 69 72 72 65 76 6f 63 61  n is.** irrevoca
2d040 62 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a  bly committed..*
2d050 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
2d060 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65   occurs, an IO e
2d070 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
2d080 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61  urned and the pa
2d090 67 65 72 0a 2a 2a 20 6d 6f 76 65 73 20 69 6e 74  ger.** moves int
2d0a0 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  o the error stat
2d0b0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  e. Otherwise, SQ
2d0c0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2d0d0 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
2d0e0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
2d0f0 61 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50  aseTwo(Pager *pP
2d100 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
2d110 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2d120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d130 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2d140 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 70 72 6f  .  /* Do not pro
2d150 63 65 65 64 20 69 66 20 74 68 65 20 70 61 67 65  ceed if the page
2d160 72 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  r is already in 
2d170 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
2d180 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
2d190 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
2d1a0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
2d1b0 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20  errCode;.  }..  
2d1c0 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
2d1d0 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63   should not be c
2d1e0 61 6c 6c 65 64 20 69 66 20 74 68 65 20 70 61 67  alled if the pag
2d1f0 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 61 74 20  er is not in at 
2d200 6c 65 61 73 74 0a 20 20 2a 2a 20 50 41 47 45 52  least.  ** PAGER
2d210 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e  _RESERVED state.
2d220 20 41 6e 64 20 69 6e 64 65 65 64 20 53 51 4c 69   And indeed SQLi
2d230 74 65 20 6e 65 76 65 72 20 64 6f 65 73 20 74 68  te never does th
2d240 69 73 2e 20 42 75 74 20 69 74 20 69 73 0a 20 20  is. But it is.  
2d250 2a 2a 20 6e 69 63 65 20 74 6f 20 68 61 76 65 20  ** nice to have 
2d260 74 68 69 73 20 64 65 66 65 6e 73 69 76 65 20 62  this defensive b
2d270 6c 6f 63 6b 20 68 65 72 65 20 61 6e 79 77 61 79  lock here anyway
2d280 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ..  */.  if( NEV
2d290 45 52 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  ER(pPager->state
2d2a0 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 29  <PAGER_RESERVED)
2d2b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2d2c0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
2d2d0 0a 0a 20 20 2f 2a 20 41 6e 20 6f 70 74 69 6d 69  ..  /* An optimi
2d2e0 7a 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 64  zation. If the d
2d2f0 61 74 61 62 61 73 65 20 77 61 73 20 6e 6f 74 20  atabase was not 
2d300 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 69 65  actually modifie
2d310 64 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 74 68  d during.  ** th
2d320 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
2d330 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
2d340 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
2d350 65 2d 6d 6f 64 65 20 61 6e 64 20 69 73 0a 20 20  e-mode and is.  
2d360 2a 2a 20 75 73 69 6e 67 20 70 65 72 73 69 73 74  ** using persist
2d370 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68  ent journals, th
2d380 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
2d390 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
2d3a0 2a 0a 20 20 2a 2a 20 54 68 65 20 73 74 61 72 74  *.  ** The start
2d3b0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2d3c0 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63  file currently c
2d3d0 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65  ontains a single
2d3e0 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68   journal .  ** h
2d3f0 65 61 64 65 72 20 77 69 74 68 20 74 68 65 20 6e  eader with the n
2d400 52 65 63 20 66 69 65 6c 64 20 73 65 74 20 74 6f  Rec field set to
2d410 20 30 2e 20 49 66 20 73 75 63 68 20 61 20 6a 6f   0. If such a jo
2d420 75 72 6e 61 6c 20 69 73 20 75 73 65 64 20 61 73  urnal is used as
2d430 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72  .  ** a hot-jour
2d440 6e 61 6c 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a  nal during hot-j
2d450 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c  ournal rollback,
2d460 20 30 20 63 68 61 6e 67 65 73 20 77 69 6c 6c 20   0 changes will 
2d470 62 65 20 6d 61 64 65 0a 20 20 2a 2a 20 74 6f 20  be made.  ** to 
2d480 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2d490 65 2e 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e  e. So there is n
2d4a0 6f 20 6e 65 65 64 20 74 6f 20 7a 65 72 6f 20 74  o need to zero t
2d4b0 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  he journal .  **
2d4c0 20 68 65 61 64 65 72 2e 20 53 69 6e 63 65 20 74   header. Since t
2d4d0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
2d4e0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
2d4f0 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a  here is no need.
2d500 20 20 2a 2a 20 74 6f 20 64 72 6f 70 20 61 6e 79    ** to drop any
2d510 20 6c 6f 63 6b 73 20 65 69 74 68 65 72 2e 0a 20   locks either.. 
2d520 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
2d530 2d 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20  ->dbModified==0 
2d540 26 26 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  && pPager->exclu
2d550 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20  siveMode .   && 
2d560 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2d570 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
2d580 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20  ALMODE_PERSIST. 
2d590 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2d5a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2d5b0 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
2d5c0 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
2d5d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d5e0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  OK;.  }..  PAGER
2d5f0 54 52 41 43 45 28 28 22 43 4f 4d 4d 49 54 20 25  TRACE(("COMMIT %
2d600 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
2d610 61 67 65 72 29 29 29 3b 0a 20 20 61 73 73 65 72  ager)));.  asser
2d620 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
2d630 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 7c  ==PAGER_SYNCED |
2d640 7c 20 4d 45 4d 44 42 20 7c 7c 20 21 70 50 61 67  | MEMDB || !pPag
2d650 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29  er->dbModified )
2d660 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65  ;.  rc = pager_e
2d670 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
2d680 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
2d690 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74  etMaster);.  ret
2d6a0 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
2d6b0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a  pPager, rc);.}..
2d6c0 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
2d6d0 6c 6c 20 63 68 61 6e 67 65 73 2e 20 54 68 65 20  ll changes. The 
2d6e0 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62  database falls b
2d6f0 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ack to PAGER_SHA
2d700 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  RED mode..**.** 
2d710 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 65  This function pe
2d720 72 66 6f 72 6d 73 20 74 77 6f 20 74 61 73 6b 73  rforms two tasks
2d730 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 74 20  :.**.**   1) It 
2d740 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 20 6a  rolls back the j
2d750 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 72 65 73  ournal file, res
2d760 74 6f 72 69 6e 67 20 61 6c 6c 20 64 61 74 61 62  toring all datab
2d770 61 73 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a  ase file and .**
2d780 20 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20        in-memory 
2d790 63 61 63 68 65 20 70 61 67 65 73 20 74 6f 20 74  cache pages to t
2d7a0 68 65 20 73 74 61 74 65 20 74 68 65 79 20 77 65  he state they we
2d7b0 72 65 20 69 6e 20 77 68 65 6e 20 74 68 65 20 74  re in when the t
2d7c0 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2d7d0 20 20 20 77 61 73 20 6f 70 65 6e 65 64 2c 20 61     was opened, a
2d7e0 6e 64 0a 2a 2a 20 20 20 32 29 20 49 74 20 66 69  nd.**   2) It fi
2d7f0 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75 72  nalizes the jour
2d800 6e 61 6c 20 66 69 6c 65 2c 20 73 6f 20 74 68 61  nal file, so tha
2d810 74 20 69 74 20 69 73 20 6e 6f 74 20 75 73 65 64  t it is not used
2d820 20 66 6f 72 20 68 6f 74 0a 2a 2a 20 20 20 20 20   for hot.**     
2d830 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61 6e 79   rollback at any
2d840 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
2d850 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 73 75 62 6a  ture..**.** subj
2d860 65 63 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ect to the follo
2d870 77 69 6e 67 20 71 75 61 6c 69 66 69 63 61 74 69  wing qualificati
2d880 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20  ons:.**.** * If 
2d890 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2d8a0 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e   is not yet open
2d8b0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
2d8c0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a  ion is called,.*
2d8d0 2a 20 20 20 74 68 65 6e 20 6f 6e 6c 79 20 28 32  *   then only (2
2d8e0 29 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20  ) is performed. 
2d8f0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2d900 72 65 20 69 73 20 6e 6f 20 6a 6f 75 72 6e 61 6c  re is no journal
2d910 20 66 69 6c 65 0a 2a 2a 20 20 20 74 6f 20 72 6f   file.**   to ro
2d920 6c 6c 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 2a  ll back..**.** *
2d930 20 49 66 20 69 6e 20 61 6e 20 65 72 72 6f 72 20   If in an error 
2d940 73 74 61 74 65 20 6f 74 68 65 72 20 74 68 61 6e  state other than
2d950 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 74 68   SQLITE_FULL, th
2d960 65 6e 20 74 61 73 6b 20 28 31 29 20 69 73 20 0a  en task (1) is .
2d970 2a 2a 20 20 20 70 65 72 66 6f 72 6d 65 64 2e 20  **   performed. 
2d980 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  If successful, t
2d990 61 73 6b 20 28 32 29 2e 20 52 65 67 61 72 64 6c  ask (2). Regardl
2d9a0 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f  ess of the outco
2d9b0 6d 65 0a 2a 2a 20 20 20 6f 66 20 65 69 74 68 65  me.**   of eithe
2d9c0 72 2c 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  r, the error sta
2d9d0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
2d9e0 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
2d9f0 20 63 61 6c 6c 65 72 0a 2a 2a 20 20 20 28 69 2e   caller.**   (i.
2da00 65 2e 20 65 69 74 68 65 72 20 53 51 4c 49 54 45  e. either SQLITE
2da10 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c 49 54 45  _IOERR or SQLITE
2da20 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a  _CORRUPT)..**.**
2da30 20 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20   * If the pager 
2da40 69 73 20 69 6e 20 50 41 47 45 52 5f 52 45 53 45  is in PAGER_RESE
2da50 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e  RVED state, then
2da60 20 61 74 74 65 6d 70 74 20 28 31 29 2e 20 57 68   attempt (1). Wh
2da70 65 74 68 65 72 0a 2a 2a 20 20 20 6f 72 20 6e 6f  ether.**   or no
2da80 74 20 28 31 29 20 69 73 20 73 75 63 63 75 73 73  t (1) is succuss
2da90 66 75 6c 2c 20 61 6c 73 6f 20 61 74 74 65 6d 70  ful, also attemp
2daa0 74 20 28 32 29 2e 20 49 66 20 73 75 63 63 65 73  t (2). If succes
2dab0 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  sful, return.** 
2dac0 20 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68    SQLITE_OK. Oth
2dad0 65 72 77 69 73 65 2c 20 65 6e 74 65 72 20 74 68  erwise, enter th
2dae0 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e  e error state an
2daf0 64 20 72 65 74 75 72 6e 20 74 68 65 20 66 69 72  d return the fir
2db00 73 74 20 0a 2a 2a 20 20 20 65 72 72 6f 72 20 63  st .**   error c
2db10 6f 64 65 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  ode encountered.
2db20 20 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74 68 69   .**.**   In thi
2db30 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20  s case there is 
2db40 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  no chance that t
2db50 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
2db60 77 72 69 74 74 65 6e 20 74 6f 2e 20 0a 2a 2a 20  written to. .** 
2db70 20 20 53 6f 20 69 73 20 73 61 66 65 20 74 6f 20    So is safe to 
2db80 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
2db90 72 6e 61 6c 20 66 69 6c 65 20 65 76 65 6e 20 69  rnal file even i
2dba0 66 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 0a  f the playback .
2dbb0 2a 2a 20 20 20 28 6f 70 65 72 61 74 69 6f 6e 20  **   (operation 
2dbc0 31 29 20 66 61 69 6c 65 64 2e 20 48 6f 77 65 76  1) failed. Howev
2dbd0 65 72 20 74 68 65 20 70 61 67 65 72 20 6d 75 73  er the pager mus
2dbe0 74 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f  t enter the erro
2dbf0 72 20 73 74 61 74 65 0a 2a 2a 20 20 20 61 73 20  r state.**   as 
2dc00 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2dc10 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
2dc20 63 68 65 20 61 72 65 20 6e 6f 77 20 73 75 73 70  che are now susp
2dc30 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 2a 20 46 69 6e  ect..**.** * Fin
2dc40 61 6c 6c 79 2c 20 69 66 20 69 6e 20 50 41 47 45  ally, if in PAGE
2dc50 52 5f 45 58 43 4c 55 53 49 56 45 20 73 74 61 74  R_EXCLUSIVE stat
2dc60 65 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20  e, then attempt 
2dc70 28 31 29 2e 20 4f 6e 6c 79 0a 2a 2a 20 20 20 61  (1). Only.**   a
2dc80 74 74 65 6d 70 74 20 28 32 29 20 69 66 20 28 31  ttempt (2) if (1
2dc90 29 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e  ) is successful.
2dca0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
2dcb0 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  K if successful,
2dcc0 0a 2a 2a 20 20 20 6f 74 68 65 72 77 69 73 65 20  .**   otherwise 
2dcd0 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20  enter the error 
2dce0 73 74 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  state and return
2dcf0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
2dd00 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 20 20 66  from the .**   f
2dd10 61 69 6c 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ailing operation
2dd20 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74 68 69  ..**.**   In thi
2dd30 73 20 63 61 73 65 20 74 68 65 20 64 61 74 61 62  s case the datab
2dd40 61 73 65 20 66 69 6c 65 20 6d 61 79 20 68 61 76  ase file may hav
2dd50 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
2dd60 6f 2e 20 53 6f 20 69 66 20 74 68 65 0a 2a 2a 20  o. So if the.** 
2dd70 20 20 70 6c 61 79 62 61 63 6b 20 6f 70 65 72 61    playback opera
2dd80 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 73 75 63  tion did not suc
2dd90 63 65 65 64 20 69 74 20 77 6f 75 6c 64 20 6e 6f  ceed it would no
2dda0 74 20 62 65 20 73 61 66 65 20 74 6f 20 66 69 6e  t be safe to fin
2ddb0 61 6c 69 7a 65 0a 2a 2a 20 20 20 74 68 65 20 6a  alize.**   the j
2ddc0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20  ournal file. It 
2ddd0 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 65 66 74  needs to be left
2dde0 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
2ddf0 74 65 6d 20 73 6f 20 74 68 61 74 0a 2a 2a 20 20  tem so that.**  
2de00 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
2de10 65 73 73 20 63 61 6e 20 75 73 65 20 69 74 20 74  ess can use it t
2de20 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
2de30 74 61 62 61 73 65 20 73 74 61 74 65 20 28 62 79  tabase state (by
2de40 0a 2a 2a 20 20 20 68 6f 74 2d 6a 6f 75 72 6e 61  .**   hot-journa
2de50 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 2a 2f 0a  l rollback)..*/.
2de60 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2de70 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  Rollback(Pager *
2de80 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
2de90 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2dea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2deb0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2dec0 2f 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  /.  PAGERTRACE((
2ded0 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c  "ROLLBACK %d\n",
2dee0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2def0 29 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  ));.  if( !pPage
2df00 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 7c 7c  r->dbModified ||
2df10 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
2df20 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 72 63 20  >jfd) ){.    rc 
2df30 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
2df40 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
2df50 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
2df60 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  r);.  }else if( 
2df70 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
2df80 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
2df90 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
2dfa0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
2dfb0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
2dfc0 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
2dfd0 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63     pager_playbac
2dfe0 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
2dff0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 50 61    }.    rc = pPa
2e000 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
2e010 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
2e020 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
2e030 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
2e040 20 20 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20        int rc2;. 
2e050 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
2e060 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
2e070 20 30 29 3b 0a 20 20 20 20 20 20 72 63 32 20 3d   0);.      rc2 =
2e080 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
2e090 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70  action(pPager, p
2e0a0 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
2e0b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2e0c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e0d0 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
2e0e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2e0f0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  e{.      rc = pa
2e100 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
2e110 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a  ger, 0);.    }..
2e120 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
2e130 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
2e140 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b  dbSizeValid = 0;
2e150 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
2e160 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2e170 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42  s during a ROLLB
2e180 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c  ACK, we can no l
2e190 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68 65 20  onger trust the 
2e1a0 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 63 61 63  pager.    ** cac
2e1b0 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65  he. So call page
2e1c0 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65  r_error() on the
2e1d0 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65   way out to make
2e1e0 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20 20 20   any error .    
2e1f0 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20  ** persistent.. 
2e200 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
2e210 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
2e220 72 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65  r, rc);.  }.  re
2e230 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2e240 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
2e250 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e260 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61  le is opened rea
2e270 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  d-only.  Return 
2e280 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20  FALSE.** if the 
2e290 64 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20  database is (in 
2e2a0 74 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65  theory) writable
2e2b0 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 50  ..*/.u8 sqlite3P
2e2c0 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50  agerIsreadonly(P
2e2d0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2e2e0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
2e2f0 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a  readOnly;.}../*.
2e300 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
2e310 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
2e320 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2e  es to the pager.
2e330 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2e340 61 67 65 72 52 65 66 63 6f 75 6e 74 28 50 61 67  agerRefcount(Pag
2e350 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
2e360 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61  eturn sqlite3Pca
2e370 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
2e380 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a  er->pPCache);.}.
2e390 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2e3a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
2e3b0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 70  rences to the sp
2e3c0 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
2e3d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2e3e0 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 44 62  rPageRefcount(Db
2e3f0 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
2e400 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63  return sqlite3Pc
2e410 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74  achePageRefcount
2e420 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 23 69 66 64  (pPage);.}..#ifd
2e430 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
2e440 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2e450 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  e is used for te
2e460 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
2e470 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  is only..*/.int 
2e480 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61  *sqlite3PagerSta
2e490 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ts(Pager *pPager
2e4a0 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
2e4b0 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20  a[11];.  a[0] = 
2e4c0 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
2e4d0 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
2e4e0 43 61 63 68 65 29 3b 0a 20 20 61 5b 31 5d 20 3d  Cache);.  a[1] =
2e4f0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
2e500 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
2e510 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 32 5d  pPCache);.  a[2]
2e520 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
2e530 47 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61  GetCachesize(pPa
2e540 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
2e550 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[3] = pPager->
2e560 64 62 53 69 7a 65 56 61 6c 69 64 20 3f 20 28 69  dbSizeValid ? (i
2e570 6e 74 29 20 70 50 61 67 65 72 2d 3e 64 62 53 69  nt) pPager->dbSi
2e580 7a 65 20 3a 20 2d 31 3b 0a 20 20 61 5b 34 5d 20  ze : -1;.  a[4] 
2e590 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b  = pPager->state;
2e5a0 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72  .  a[5] = pPager
2e5b0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36  ->errCode;.  a[6
2e5c0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74  ] = pPager->nHit
2e5d0 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65  ;.  a[7] = pPage
2e5e0 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d  r->nMiss;.  a[8]
2e5f0 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74   = 0;  /* Used t
2e600 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76  o be pPager->nOv
2e610 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70  fl */.  a[9] = p
2e620 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20  Pager->nRead;.  
2e630 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e  a[10] = pPager->
2e640 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e  nWrite;.  return
2e650 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   a;.}.#endif../*
2e660 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
2e670 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  if this is an in
2e680 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a 2a  -memory pager..*
2e690 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2e6a0 65 72 49 73 4d 65 6d 64 62 28 50 61 67 65 72 20  erIsMemdb(Pager 
2e6b0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
2e6c0 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 0a 2f 2a 0a  rn MEMDB;.}../*.
2e6d0 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  ** Check that th
2e6e0 65 72 65 20 61 72 65 20 61 74 20 6c 65 61 73 74  ere are at least
2e6f0 20 6e 53 61 76 65 70 6f 69 6e 74 20 73 61 76 65   nSavepoint save
2e700 70 6f 69 6e 74 73 20 6f 70 65 6e 2e 20 49 66 20  points open. If 
2e710 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 63 75 72  there are.** cur
2e720 72 65 6e 74 6c 79 20 6c 65 73 73 20 74 68 61 6e  rently less than
2e730 20 6e 53 61 76 65 70 6f 69 6e 74 73 20 6f 70 65   nSavepoints ope
2e740 6e 2c 20 74 68 65 6e 20 6f 70 65 6e 20 6f 6e 65  n, then open one
2e750 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69   or more savepoi
2e760 6e 74 73 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 75  nts.** to make u
2e770 70 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  p the difference
2e780 2e 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  . If the number 
2e790 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 20 69 73  of savepoints is
2e7a0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 65 71 75 61   already.** equa
2e7b0 6c 20 74 6f 20 6e 53 61 76 65 70 6f 69 6e 74 2c  l to nSavepoint,
2e7c0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
2e7d0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
2e7e0 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
2e7f0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
2e800 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ls, SQLITE_NOMEM
2e810 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
2e820 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63   an error .** oc
2e830 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69  curs while openi
2e840 6e 67 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ng the sub-journ
2e850 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 61 6e  al file, then an
2e860 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
2e870 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f  s.** returned. O
2e880 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
2e890 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
2e8a0 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
2e8b0 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61  point(Pager *pPa
2e8c0 67 65 72 2c 20 69 6e 74 20 6e 53 61 76 65 70 6f  ger, int nSavepo
2e8d0 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  int){.  int rc =
2e8e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2e8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e900 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2e910 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 72 65   */.  int nCurre
2e920 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 61  nt = pPager->nSa
2e930 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20  vepoint;        
2e940 2f 2a 20 43 75 72 72 65 6e 74 20 6e 75 6d 62 65  /* Current numbe
2e950 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 20  r of savepoints 
2e960 2a 2f 0a 0a 20 20 69 66 28 20 6e 53 61 76 65 70  */..  if( nSavep
2e970 6f 69 6e 74 3e 6e 43 75 72 72 65 6e 74 20 26 26  oint>nCurrent &&
2e980 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
2e990 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  nal ){.    int i
2e9a0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
2e9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e9c0 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
2e9d0 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 50  ariable */.    P
2e9e0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61  agerSavepoint *a
2e9f0 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
2ea00 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 50 61         /* New Pa
2ea10 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
2ea20 72 72 61 79 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  rray */..    /* 
2ea30 45 69 74 68 65 72 20 74 68 65 72 65 20 69 73 20  Either there is 
2ea40 6e 6f 20 61 63 74 69 76 65 20 6a 6f 75 72 6e 61  no active journa
2ea50 6c 20 6f 72 20 74 68 65 20 73 75 62 2d 6a 6f 75  l or the sub-jou
2ea60 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 6f 72 20  rnal is open or 
2ea70 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  .    ** the jour
2ea80 6e 61 6c 20 69 73 20 61 6c 77 61 79 73 20 73 74  nal is always st
2ea90 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 2a  ored in memory *
2eaa0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
2eab0 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
2eac0 3d 3d 30 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50  ==0 || isOpen(pP
2ead0 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 0a 20  ager->sjfd) ||. 
2eae0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
2eaf0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
2eb00 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2eb10 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 0a 20 20 20  E_MEMORY );..   
2eb20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20 50 61 67   /* Grow the Pag
2eb30 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72  er.aSavepoint ar
2eb40 72 61 79 20 75 73 69 6e 67 20 72 65 61 6c 6c 6f  ray using reallo
2eb50 63 28 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  c(). Return SQLI
2eb60 54 45 5f 4e 4f 4d 45 4d 0a 20 20 20 20 2a 2a 20  TE_NOMEM.    ** 
2eb70 69 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  if the allocatio
2eb80 6e 20 66 61 69 6c 73 2e 20 4f 74 68 65 72 77 69  n fails. Otherwi
2eb90 73 65 2c 20 7a 65 72 6f 20 74 68 65 20 6e 65 77  se, zero the new
2eba0 20 70 6f 72 74 69 6f 6e 20 69 6e 20 63 61 73 65   portion in case
2ebb0 20 61 20 0a 20 20 20 20 2a 2a 20 6d 61 6c 6c 6f   a .    ** mallo
2ebc0 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  c failure occurs
2ebd0 20 77 68 69 6c 65 20 70 6f 70 75 6c 61 74 69 6e   while populatin
2ebe0 67 20 69 74 20 69 6e 20 74 68 65 20 66 6f 72 28  g it in the for(
2ebf0 2e 2e 2e 29 20 6c 6f 6f 70 20 62 65 6c 6f 77 2e  ...) loop below.
2ec00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 4e 65 77  .    */.    aNew
2ec10 20 3d 20 28 50 61 67 65 72 53 61 76 65 70 6f 69   = (PagerSavepoi
2ec20 6e 74 20 2a 29 73 71 6c 69 74 65 33 52 65 61 6c  nt *)sqlite3Real
2ec30 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70 50 61  loc(.        pPa
2ec40 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 2c  ger->aSavepoint,
2ec50 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76   sizeof(PagerSav
2ec60 65 70 6f 69 6e 74 29 2a 6e 53 61 76 65 70 6f 69  epoint)*nSavepoi
2ec70 6e 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  nt.    );.    if
2ec80 28 20 21 61 4e 65 77 20 29 7b 0a 20 20 20 20 20  ( !aNew ){.     
2ec90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2eca0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
2ecb0 6d 65 6d 73 65 74 28 26 61 4e 65 77 5b 6e 43 75  memset(&aNew[nCu
2ecc0 72 72 65 6e 74 5d 2c 20 30 2c 20 28 6e 53 61 76  rrent], 0, (nSav
2ecd0 65 70 6f 69 6e 74 2d 6e 43 75 72 72 65 6e 74 29  epoint-nCurrent)
2ece0 20 2a 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53   * sizeof(PagerS
2ecf0 61 76 65 70 6f 69 6e 74 29 29 3b 0a 20 20 20 20  avepoint));.    
2ed00 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
2ed10 6e 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 70  nt = aNew;.    p
2ed20 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
2ed30 74 20 3d 20 6e 53 61 76 65 70 6f 69 6e 74 3b 0a  t = nSavepoint;.
2ed40 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65  .    /* Populate
2ed50 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
2ed60 69 6e 74 20 73 74 72 75 63 74 75 72 65 73 20 6a  int structures j
2ed70 75 73 74 20 61 6c 6c 6f 63 61 74 65 64 2e 20 2a  ust allocated. *
2ed80 2f 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e 43 75  /.    for(ii=nCu
2ed90 72 72 65 6e 74 3b 20 69 69 3c 6e 53 61 76 65 70  rrent; ii<nSavep
2eda0 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
2edb0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2edc0 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29  r->dbSizeValid )
2edd0 3b 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d  ;.      aNew[ii]
2ede0 2e 6e 4f 72 69 67 20 3d 20 70 50 61 67 65 72 2d  .nOrig = pPager-
2edf0 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 69  >dbSize;.      i
2ee00 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
2ee10 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72  ->jfd) && pPager
2ee20 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 29  ->journalOff>0 )
2ee30 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69  {.        aNew[i
2ee40 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 70 50 61  i].iOffset = pPa
2ee50 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
2ee60 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2ee70 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69        aNew[ii].i
2ee80 4f 66 66 73 65 74 20 3d 20 4a 4f 55 52 4e 41 4c  Offset = JOURNAL
2ee90 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
2eea0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
2eeb0 4e 65 77 5b 69 69 5d 2e 69 53 75 62 52 65 63 20  New[ii].iSubRec 
2eec0 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  = pPager->nSubRe
2eed0 63 3b 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69  c;.      aNew[ii
2eee0 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 3d  ].pInSavepoint =
2eef0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
2ef00 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53  eate(pPager->dbS
2ef10 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
2ef20 21 61 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76  !aNew[ii].pInSav
2ef30 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20  epoint ){.      
2ef40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ef50 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
2ef60 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 70 65     }..    /* Ope
2ef70 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  n the sub-journa
2ef80 6c 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  l, if it is not 
2ef90 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 2e 20  already opened. 
2efa0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e  */.    rc = open
2efb0 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  SubJournal(pPage
2efc0 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  r);.  }..  retur
2efd0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
2efe0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2eff0 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61  called to rollba
2f000 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 20 28 63  ck or release (c
2f010 6f 6d 6d 69 74 29 20 61 20 73 61 76 65 70 6f 69  ommit) a savepoi
2f020 6e 74 2e 0a 2a 2a 20 54 68 65 20 73 61 76 65 70  nt..** The savep
2f030 6f 69 6e 74 20 74 6f 20 72 65 6c 65 61 73 65 20  oint to release 
2f040 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64  or rollback need
2f050 20 6e 6f 74 20 62 65 20 74 68 65 20 6d 6f 73 74   not be the most
2f060 20 72 65 63 65 6e 74 6c 79 20 0a 2a 2a 20 63 72   recently .** cr
2f070 65 61 74 65 64 20 73 61 76 65 70 6f 69 6e 74 2e  eated savepoint.
2f080 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
2f090 20 6f 70 20 69 73 20 61 6c 77 61 79 73 20 65 69   op is always ei
2f0a0 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52  ther SAVEPOINT_R
2f0b0 4f 4c 4c 42 41 43 4b 20 6f 72 20 53 41 56 45 50  OLLBACK or SAVEP
2f0c0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 0a 2a 2a  OINT_RELEASE..**
2f0d0 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f   If it is SAVEPO
2f0e0 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65  INT_RELEASE, the
2f0f0 6e 20 72 65 6c 65 61 73 65 20 61 6e 64 20 64 65  n release and de
2f100 73 74 72 6f 79 20 74 68 65 20 73 61 76 65 70 6f  stroy the savepo
2f110 69 6e 74 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65  int with.** inde
2f120 78 20 69 53 61 76 65 70 6f 69 6e 74 2e 20 49 66  x iSavepoint. If
2f130 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54   it is SAVEPOINT
2f140 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20  _ROLLBACK, then 
2f150 72 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61  rollback all cha
2f160 6e 67 65 73 0a 2a 2a 20 74 68 61 74 20 68 61 76  nges.** that hav
2f170 65 20 6f 63 63 75 72 72 65 64 20 73 69 6e 63 65  e occurred since
2f180 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 73   the specified s
2f190 61 76 65 70 6f 69 6e 74 20 77 61 73 20 63 72 65  avepoint was cre
2f1a0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ated..**.** The 
2f1b0 73 61 76 65 70 6f 69 6e 74 20 74 6f 20 72 6f 6c  savepoint to rol
2f1c0 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65 61 73 65  lback or release
2f1d0 20 69 73 20 69 64 65 6e 74 69 66 69 65 64 20 62   is identified b
2f1e0 79 20 70 61 72 61 6d 65 74 65 72 20 0a 2a 2a 20  y parameter .** 
2f1f0 69 53 61 76 65 70 6f 69 6e 74 2e 20 41 20 76 61  iSavepoint. A va
2f200 6c 75 65 20 6f 66 20 30 20 6d 65 61 6e 73 20 74  lue of 0 means t
2f210 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
2f220 20 6f 75 74 65 72 6d 6f 73 74 20 73 61 76 65 70   outermost savep
2f230 6f 69 6e 74 0a 2a 2a 20 28 74 68 65 20 66 69 72  oint.** (the fir
2f240 73 74 20 63 72 65 61 74 65 64 29 2e 20 41 20 76  st created). A v
2f250 61 6c 75 65 20 6f 66 20 28 50 61 67 65 72 2e 6e  alue of (Pager.n
2f260 53 61 76 65 70 6f 69 6e 74 2d 31 29 20 6d 65 61  Savepoint-1) mea
2f270 6e 73 20 6f 70 65 72 61 74 65 0a 2a 2a 20 6f 6e  ns operate.** on
2f280 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
2f290 6c 79 20 63 72 65 61 74 65 64 20 73 61 76 65 70  ly created savep
2f2a0 6f 69 6e 74 2e 20 49 66 20 69 53 61 76 65 70 6f  oint. If iSavepo
2f2b0 69 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74  int is greater t
2f2c0 68 61 6e 0a 2a 2a 20 28 50 61 67 65 72 2e 6e 53  han.** (Pager.nS
2f2d0 61 76 65 70 6f 69 6e 74 2d 31 29 2c 20 74 68 65  avepoint-1), the
2f2e0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
2f2f0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
2f300 2a 20 49 66 20 61 20 6e 65 67 61 74 69 76 65 20  * If a negative 
2f310 76 61 6c 75 65 20 69 73 20 70 61 73 73 65 64 20  value is passed 
2f320 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
2f330 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 72 65  , then the curre
2f340 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  nt.** transactio
2f350 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
2f360 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72  . This is differ
2f370 65 6e 74 20 74 6f 20 63 61 6c 6c 69 6e 67 20 0a  ent to calling .
2f380 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  ** sqlite3PagerR
2f390 6f 6c 6c 62 61 63 6b 28 29 20 62 65 63 61 75 73  ollback() becaus
2f3a0 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
2f3b0 64 6f 65 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61  does not termina
2f3c0 74 65 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61  te.** the transa
2f3d0 63 74 69 6f 6e 20 6f 72 20 75 6e 6c 6f 63 6b 20  ction or unlock 
2f3e0 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74  the database, it
2f3f0 20 6a 75 73 74 20 72 65 73 74 6f 72 65 73 20 74   just restores t
2f400 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  he .** contents 
2f410 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2f420 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
2f430 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 6e  state. .**.** In
2f440 20 61 6e 79 20 63 61 73 65 2c 20 61 6c 6c 20 73   any case, all s
2f450 61 76 65 70 6f 69 6e 74 73 20 77 69 74 68 20 61  avepoints with a
2f460 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20  n index greater 
2f470 74 68 61 6e 20 69 53 61 76 65 70 6f 69 6e 74 20  than iSavepoint 
2f480 0a 2a 2a 20 61 72 65 20 64 65 73 74 72 6f 79 65  .** are destroye
2f490 64 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 20  d. If this is a 
2f4a0 72 65 6c 65 61 73 65 20 6f 70 65 72 61 74 69 6f  release operatio
2f4b0 6e 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  n (op==SAVEPOINT
2f4c0 5f 52 45 4c 45 41 53 45 29 2c 0a 2a 2a 20 74 68  _RELEASE),.** th
2f4d0 65 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 53 61  en savepoint iSa
2f4e0 76 65 70 6f 69 6e 74 20 69 73 20 61 6c 73 6f 20  vepoint is also 
2f4f0 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a  destroyed..**.**
2f500 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
2f510 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
2f520 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 65 6d 6f  _NOMEM if a memo
2f530 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
2f540 69 6c 73 2c 0a 2a 2a 20 6f 72 20 61 6e 20 49 4f  ils,.** or an IO
2f550 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
2f560 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
2f570 73 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 20  s while rolling 
2f580 62 61 63 6b 20 61 20 0a 2a 2a 20 73 61 76 65 70  back a .** savep
2f590 6f 69 6e 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f  oint. If no erro
2f5a0 72 73 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45  rs occur, SQLITE
2f5b0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
2f5c0 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33  .*/ .int sqlite3
2f5d0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 50  PagerSavepoint(P
2f5e0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
2f5f0 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70  t op, int iSavep
2f600 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  oint){.  int rc 
2f610 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
2f620 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45  assert( op==SAVE
2f630 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c  POINT_RELEASE ||
2f640 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
2f650 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 61 73 73  OLLBACK );.  ass
2f660 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e  ert( iSavepoint>
2f670 3d 30 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f  =0 || op==SAVEPO
2f680 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
2f690 0a 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e  .  if( iSavepoin
2f6a0 74 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  t<pPager->nSavep
2f6b0 6f 69 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  oint ){.    int 
2f6c0 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ii;            /
2f6d0 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
2f6e0 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ble */.    int n
2f6f0 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  New;          /*
2f700 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 6d 61 69   Number of remai
2f710 6e 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 73 20  ning savepoints 
2f720 61 66 74 65 72 20 74 68 69 73 20 6f 70 2e 20 2a  after this op. *
2f730 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65  /..    /* Figure
2f740 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 73 61   out how many sa
2f750 76 65 70 6f 69 6e 74 73 20 77 69 6c 6c 20 73 74  vepoints will st
2f760 69 6c 6c 20 62 65 20 61 63 74 69 76 65 20 61 66  ill be active af
2f770 74 65 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ter this.    ** 
2f780 6f 70 65 72 61 74 69 6f 6e 2e 20 53 74 6f 72 65  operation. Store
2f790 20 74 68 69 73 20 76 61 6c 75 65 20 69 6e 20 6e   this value in n
2f7a0 4e 65 77 2e 20 54 68 65 6e 20 66 72 65 65 20 72  New. Then free r
2f7b0 65 73 6f 75 72 63 65 73 20 61 73 73 6f 63 69 61  esources associa
2f7c0 74 65 64 20 0a 20 20 20 20 2a 2a 20 77 69 74 68  ted .    ** with
2f7d0 20 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20   any savepoints 
2f7e0 74 68 61 74 20 61 72 65 20 64 65 73 74 72 6f 79  that are destroy
2f7f0 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61  ed by this opera
2f800 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
2f810 20 6e 4e 65 77 20 3d 20 69 53 61 76 65 70 6f 69   nNew = iSavepoi
2f820 6e 74 20 2b 20 28 6f 70 3d 3d 53 41 56 45 50 4f  nt + (op==SAVEPO
2f830 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20  INT_ROLLBACK);. 
2f840 20 20 20 66 6f 72 28 69 69 3d 6e 4e 65 77 3b 20     for(ii=nNew; 
2f850 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
2f860 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
2f870 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
2f880 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
2f890 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
2f8a0 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  pInSavepoint);. 
2f8b0 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
2f8c0 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 6e 4e  >nSavepoint = nN
2f8d0 65 77 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  ew;..    /* If t
2f8e0 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63  his is a rollbac
2f8f0 6b 20 6f 70 65 72 61 74 69 6f 6e 2c 20 70 6c 61  k operation, pla
2f900 79 62 61 63 6b 20 74 68 65 20 73 70 65 63 69 66  yback the specif
2f910 69 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a 20  ied savepoint.. 
2f920 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
2f930 20 61 20 74 65 6d 70 2d 66 69 6c 65 2c 20 69 74   a temp-file, it
2f940 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61   is possible tha
2f950 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
2f960 6c 65 20 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f  le has.    ** no
2f970 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65  t yet been opene
2f980 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
2f990 74 68 65 72 65 20 68 61 76 65 20 62 65 65 6e 20  there have been 
2f9a0 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f 0a 20 20  no changes to.  
2f9b0 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
2f9c0 65 20 66 69 6c 65 2c 20 73 6f 20 74 68 65 20 70  e file, so the p
2f9d0 6c 61 79 62 61 63 6b 20 6f 70 65 72 61 74 69 6f  layback operatio
2f9e0 6e 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64  n can be skipped
2f9f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2fa00 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
2fa10 4f 4c 4c 42 41 43 4b 20 26 26 20 69 73 4f 70 65  OLLBACK && isOpe
2fa20 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
2fa30 7b 0a 20 20 20 20 20 20 50 61 67 65 72 53 61 76  {.      PagerSav
2fa40 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69  epoint *pSavepoi
2fa50 6e 74 20 3d 20 28 6e 4e 65 77 3d 3d 30 29 3f 30  nt = (nNew==0)?0
2fa60 3a 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70  :&pPager->aSavep
2fa70 6f 69 6e 74 5b 6e 4e 65 77 2d 31 5d 3b 0a 20 20  oint[nNew-1];.  
2fa80 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 6c      rc = pagerPl
2fa90 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28  aybackSavepoint(
2faa0 70 50 61 67 65 72 2c 20 70 53 61 76 65 70 6f 69  pPager, pSavepoi
2fab0 6e 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nt);.      asser
2fac0 74 28 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  t(rc!=SQLITE_DON
2fad0 45 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  E);.    }.  .   
2fae0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
2faf0 20 72 65 6c 65 61 73 65 20 6f 66 20 74 68 65 20   release of the 
2fb00 6f 75 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f  outermost savepo
2fb10 69 6e 74 2c 20 74 72 75 6e 63 61 74 65 20 0a 20  int, truncate . 
2fb20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f     ** the sub-jo
2fb30 75 72 6e 61 6c 20 74 6f 20 7a 65 72 6f 20 62 79  urnal to zero by
2fb40 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a  tes in size. */.
2fb50 20 20 20 20 69 66 28 20 6e 4e 65 77 3d 3d 30 20      if( nNew==0 
2fb60 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  && op==SAVEPOINT
2fb70 5f 52 45 4c 45 41 53 45 20 26 26 20 69 73 4f 70  _RELEASE && isOp
2fb80 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
2fb90 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2fba0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2fbb0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
2fbc0 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
2fbd0 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 30 29  pPager->sjfd, 0)
2fbe0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
2fbf0 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 20 20 20  nSubRec = 0;.   
2fc00 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2fc10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
2fc20 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
2fc30 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74  hname of the dat
2fc40 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
2fc50 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
2fc60 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
2fc70 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2fc80 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
2fc90 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f  >zFilename;.}../
2fca0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2fcb0 56 46 53 20 73 74 72 75 63 74 75 72 65 20 66 6f  VFS structure fo
2fcc0 72 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a  r the pager..*/.
2fcd0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 76 66  const sqlite3_vf
2fce0 73 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 56  s *sqlite3PagerV
2fcf0 66 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  fs(Pager *pPager
2fd00 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
2fd10 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a  er->pVfs;.}../*.
2fd20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 69  ** Return the fi
2fd30 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68  le handle for th
2fd40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2fd50 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
2fd60 74 68 20 74 68 65 20 70 61 67 65 72 2e 20 20 54  th the pager.  T
2fd70 68 69 73 20 6d 69 67 68 74 20 72 65 74 75 72 6e  his might return
2fd80 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 66 69 6c   NULL if the fil
2fd90 65 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 79 65 74  e has.** not yet
2fda0 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f   been opened..*/
2fdb0 0a 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73  .sqlite3_file *s
2fdc0 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
2fdd0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2fde0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
2fdf0 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  >fd;.}../*.** Re
2fe00 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61  turn the full pa
2fe10 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  thname of the jo
2fe20 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63  urnal file..*/.c
2fe30 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
2fe40 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61  e3PagerJournalna
2fe50 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
2fe60 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
2fe70 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a  er->zJournal;.}.
2fe80 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
2fe90 75 65 20 69 66 20 66 73 79 6e 63 28 29 20 63 61  ue if fsync() ca
2fea0 6c 6c 73 20 61 72 65 20 64 69 73 61 62 6c 65 64  lls are disabled
2feb0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
2fec0 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a    Return FALSE.*
2fed0 2a 20 69 66 20 66 73 79 6e 63 28 29 73 20 61 72  * if fsync()s ar
2fee0 65 20 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61  e executed norma
2fef0 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  lly..*/.int sqli
2ff00 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50  te3PagerNosync(P
2ff10 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2ff20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
2ff30 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65  noSync;.}..#ifde
2ff40 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
2ff50 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20  EC./*.** Set or 
2ff60 72 65 74 72 69 65 76 65 20 74 68 65 20 63 6f 64  retrieve the cod
2ff70 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ec for this page
2ff80 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  r.*/.static void
2ff90 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
2ffa0 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a  Codec(.  Pager *
2ffb0 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a  pPager,.  void *
2ffc0 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
2ffd0 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c  void*,Pgno,int),
2ffe0 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
2fff0 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c  SizeChng)(void*,
30000 69 6e 74 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64  int,int),.  void
30010 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76   (*xCodecFree)(v
30020 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 20 2a 70  oid*),.  void *p
30030 43 6f 64 65 63 0a 29 7b 0a 20 20 69 66 28 20 70  Codec.){.  if( p
30040 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65  Pager->xCodecFre
30050 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  e ) pPager->xCod
30060 65 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  ecFree(pPager->p
30070 43 6f 64 65 63 29 3b 0a 20 20 70 50 61 67 65 72  Codec);.  pPager
30080 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65  ->xCodec = xCode
30090 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  c;.  pPager->xCo
300a0 64 65 63 53 69 7a 65 43 68 6e 67 20 3d 20 78 43  decSizeChng = xC
300b0 6f 64 65 63 53 69 7a 65 43 68 6e 67 3b 0a 20 20  odecSizeChng;.  
300c0 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72  pPager->xCodecFr
300d0 65 65 20 3d 20 78 43 6f 64 65 63 46 72 65 65 3b  ee = xCodecFree;
300e0 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  .  pPager->pCode
300f0 63 20 3d 20 70 43 6f 64 65 63 3b 0a 20 20 70 61  c = pCodec;.  pa
30100 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50  gerReportSize(pP
30110 61 67 65 72 29 3b 0a 7d 0a 73 74 61 74 69 63 20  ager);.}.static 
30120 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
30130 65 72 47 65 74 43 6f 64 65 63 28 50 61 67 65 72  erGetCodec(Pager
30140 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
30150 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 43 6f 64  urn pPager->pCod
30160 65 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ec;.}.#endif..#i
30170 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
30180 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
30190 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65  ** Move the page
301a0 20 70 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e   pPg to location
301b0 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c   pgno in the fil
301c0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  e..**.** There m
301d0 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65  ust be no refere
301e0 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
301f0 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61   previously loca
30200 74 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28  ted at.** pgno (
30210 77 68 69 63 68 20 77 65 20 63 61 6c 6c 20 70 50  which we call pP
30220 67 4f 6c 64 29 20 74 68 6f 75 67 68 20 74 68 61  gOld) though tha
30230 74 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 77 65  t page is allowe
30240 64 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61  d to be.** in ca
30250 63 68 65 2e 20 20 49 66 20 74 68 65 20 70 61 67  che.  If the pag
30260 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63  e previously loc
30270 61 74 65 64 20 61 74 20 70 67 6e 6f 20 69 73 20  ated at pgno is 
30280 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69  not already.** i
30290 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
302a0 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f  ournal, it is no
302b0 74 20 70 75 74 20 74 68 65 72 65 20 62 79 20 62  t put there by b
302c0 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  y this routine..
302d0 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73  **.** References
302e0 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 50 67   to the page pPg
302f0 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55   remain valid. U
30300 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d  pdating any.** m
30310 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61  eta-data associa
30320 74 65 64 20 77 69 74 68 20 70 50 67 20 28 69 2e  ted with pPg (i.
30330 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69  e. data stored i
30340 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74  n the nExtra byt
30350 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  es.** allocated 
30360 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70  along with the p
30370 61 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70  age) is the resp
30380 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
30390 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
303a0 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  A transaction mu
303b0 73 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65  st be active whe
303c0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
303d0 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65  s called. It use
303e0 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69  d to be.** requi
303f0 72 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65  red that a state
30400 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
30410 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c   was not active,
30420 20 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69   but this restri
30430 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65  ction.** has bee
30440 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54  n removed (CREAT
30450 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f  E INDEX needs to
30460 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65   move a page whe
30470 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  n a statement.**
30480 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
30490 61 63 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49  active)..**.** I
304a0 66 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67  f the fourth arg
304b0 75 6d 65 6e 74 2c 20 69 73 43 6f 6d 6d 69 74 2c  ument, isCommit,
304c0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
304d0 65 6e 20 74 68 69 73 20 70 61 67 65 20 69 73 20  en this page is 
304e0 62 65 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20 61  being.** moved a
304f0 73 20 70 61 72 74 20 6f 66 20 61 20 64 61 74 61  s part of a data
30500 62 61 73 65 20 72 65 6f 72 67 61 6e 69 7a 61 74  base reorganizat
30510 69 6f 6e 20 6a 75 73 74 20 62 65 66 6f 72 65 20  ion just before 
30520 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
30530 0a 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 6f 6d  .** is being com
30540 6d 69 74 74 65 64 2e 20 49 6e 20 74 68 69 73 20  mitted. In this 
30550 63 61 73 65 2c 20 69 74 20 69 73 20 67 75 61 72  case, it is guar
30560 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
30570 64 61 74 61 62 61 73 65 20 70 61 67 65 20 0a 2a  database page .*
30580 2a 20 70 50 67 20 72 65 66 65 72 73 20 74 6f 20  * pPg refers to 
30590 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74  will not be writ
305a0 74 65 6e 20 74 6f 20 61 67 61 69 6e 20 77 69 74  ten to again wit
305b0 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hin this transac
305c0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
305d0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65   function may re
305e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
305f0 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  M or an IO error
30600 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f   code if an erro
30610 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 4f 74 68  r.** occurs. Oth
30620 65 72 77 69 73 65 2c 20 69 74 20 72 65 74 75 72  erwise, it retur
30630 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  ns SQLITE_OK..*/
30640 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
30650 72 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72 20  rMovepage(Pager 
30660 2a 70 50 61 67 65 72 2c 20 44 62 50 61 67 65 20  *pPager, DbPage 
30670 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  *pPg, Pgno pgno,
30680 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 29 7b 0a   int isCommit){.
30690 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b    PgHdr *pPgOld;
306a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
306b0 2a 20 54 68 65 20 70 61 67 65 20 62 65 69 6e 67  * The page being
306c0 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f   overwritten. */
306d0 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63  .  Pgno needSync
306e0 50 67 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  Pgno = 0;       
306f0 2f 2a 20 4f 6c 64 20 76 61 6c 75 65 20 6f 66 20  /* Old value of 
30700 70 50 67 2d 3e 70 67 6e 6f 2c 20 69 66 20 73 79  pPg->pgno, if sy
30710 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 20 2a  nc is required *
30720 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
30730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30740 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
30750 2a 2f 0a 20 20 50 67 6e 6f 20 6f 72 69 67 50 67  */.  Pgno origPg
30760 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
30770 20 20 2f 2a 20 54 68 65 20 6f 72 69 67 69 6e 61    /* The origina
30780 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  l page number */
30790 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ..  assert( pPg-
307a0 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a  >nRef>0 );..  /*
307b0 20 49 66 20 74 68 65 20 70 61 67 65 20 62 65 69   If the page bei
307c0 6e 67 20 6d 6f 76 65 64 20 69 73 20 64 69 72 74  ng moved is dirt
307d0 79 20 61 6e 64 20 68 61 73 20 6e 6f 74 20 62 65  y and has not be
307e0 65 6e 20 73 61 76 65 64 20 62 79 20 74 68 65 20  en saved by the 
307f0 6c 61 74 65 73 74 0a 20 20 2a 2a 20 73 61 76 65  latest.  ** save
30800 70 6f 69 6e 74 2c 20 74 68 65 6e 20 73 61 76 65  point, then save
30810 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
30820 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
30830 65 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 2a 2a  e into the .  **
30840 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6e 6f 77   sub-journal now
30850 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
30860 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ed to handle the
30870 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65 6e 61   following scena
30880 72 69 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  rio:.  **.  **  
30890 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20 20 20   BEGIN;.  **    
308a0 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58   <journal page X
308b0 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 20 69 74  , then modify it
308c0 20 69 6e 20 6d 65 6d 6f 72 79 3e 0a 20 20 2a 2a   in memory>.  **
308d0 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f       SAVEPOINT o
308e0 6e 65 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c  ne;.  **       <
308f0 4d 6f 76 65 20 70 61 67 65 20 58 20 74 6f 20 6c  Move page X to l
30900 6f 63 61 74 69 6f 6e 20 59 3e 0a 20 20 2a 2a 20  ocation Y>.  ** 
30910 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20      ROLLBACK TO 
30920 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  one;.  **.  ** I
30930 66 20 70 61 67 65 20 58 20 77 65 72 65 20 6e 6f  f page X were no
30940 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  t written to the
30950 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 68 65 72   sub-journal her
30960 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a  e, it would not.
30970 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65    ** be possible
30980 20 74 6f 20 72 65 73 74 6f 72 65 20 69 74 73 20   to restore its 
30990 63 6f 6e 74 65 6e 74 73 20 77 68 65 6e 20 74 68  contents when th
309a0 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f  e "ROLLBACK TO o
309b0 6e 65 22 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  ne".  ** stateme
309c0 6e 74 20 77 65 72 65 20 69 73 20 70 72 6f 63 65  nt were is proce
309d0 73 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ssed..  **.  ** 
309e0 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 29  subjournalPage()
309f0 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 61 6c 6c   may need to all
30a00 6f 63 61 74 65 20 73 70 61 63 65 20 74 6f 20 73  ocate space to s
30a10 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69  tore pPg->pgno i
30a20 6e 74 6f 0a 20 20 2a 2a 20 6f 6e 65 20 6f 72 20  nto.  ** one or 
30a30 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 20 62  more savepoint b
30a40 69 74 76 65 63 73 2e 20 54 68 69 73 20 69 73 20  itvecs. This is 
30a50 74 68 65 20 72 65 61 73 6f 6e 20 74 68 69 73 20  the reason this 
30a60 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6d 61  function.  ** ma
30a70 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
30a80 4e 4f 4d 45 4d 2e 0a 20 20 2a 2f 0a 20 20 69 66  NOMEM..  */.  if
30a90 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
30aa0 44 52 5f 44 49 52 54 59 20 0a 20 20 20 26 26 20  DR_DIRTY .   && 
30ab0 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
30ac0 28 70 50 67 29 0a 20 20 20 26 26 20 53 51 4c 49  (pPg).   && SQLI
30ad0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 75 62  TE_OK!=(rc = sub
30ae0 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29  journalPage(pPg)
30af0 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
30b00 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47  n rc;.  }..  PAG
30b10 45 52 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25  ERTRACE(("MOVE %
30b20 64 20 70 61 67 65 20 25 64 20 28 6e 65 65 64 53  d page %d (needS
30b30 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f  ync=%d) moves to
30b40 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50   %d\n", .      P
30b50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
30b60 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 70 50 67 2d  pPg->pgno, (pPg-
30b70 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
30b80 44 5f 53 59 4e 43 29 3f 31 3a 30 2c 20 70 67 6e  D_SYNC)?1:0, pgn
30b90 6f 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  o));.  IOTRACE((
30ba0 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e  "MOVE %p %d %d\n
30bb0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
30bc0 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20  pgno, pgno))..  
30bd0 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  /* If the journa
30be0 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79  l needs to be sy
30bf0 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 70 61  nc()ed before pa
30c00 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20 63 61 6e  ge pPg->pgno can
30c10 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e  .  ** be written
30c20 20 74 6f 2c 20 73 74 6f 72 65 20 70 50 67 2d 3e   to, store pPg->
30c30 70 67 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20 76 61  pgno in local va
30c40 72 69 61 62 6c 65 20 6e 65 65 64 53 79 6e 63 50  riable needSyncP
30c50 67 6e 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  gno..  **.  ** I
30c60 66 20 74 68 65 20 69 73 43 6f 6d 6d 69 74 20 66  f the isCommit f
30c70 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 72  lag is set, ther
30c80 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
30c90 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 20 20  remember that.  
30ca0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e  ** the journal n
30cb0 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28  eeds to be sync(
30cc0 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62  )ed before datab
30cd0 61 73 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67  ase page pPg->pg
30ce0 6e 6f 20 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20  no .  ** can be 
30cf0 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20  written to. The 
30d00 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61  caller has alrea
30d10 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20  dy promised not 
30d20 74 6f 20 77 72 69 74 65 20 74 6f 20 69 74 2e 0a  to write to it..
30d30 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 67 2d    */.  if( (pPg-
30d40 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
30d50 44 5f 53 59 4e 43 29 20 26 26 20 21 69 73 43 6f  D_SYNC) && !isCo
30d60 6d 6d 69 74 20 29 7b 0a 20 20 20 20 6e 65 65 64  mmit ){.    need
30d70 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e  SyncPgno = pPg->
30d80 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74  pgno;.    assert
30d90 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  ( pageInJournal(
30da0 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  pPg) || pPg->pgn
30db0 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  o>pPager->dbOrig
30dc0 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65  Size );.    asse
30dd0 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  rt( pPg->flags&P
30de0 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20  GHDR_DIRTY );.  
30df0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
30e00 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20  ->needSync );.  
30e10 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  }..  /* If the c
30e20 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  ache contains a 
30e30 70 61 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e  page with page-n
30e40 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f  umber pgno, remo
30e50 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20  ve it.  ** from 
30e60 69 74 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20  its hash chain. 
30e70 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48  Also, if the PgH
30e80 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20  dr.needSync was 
30e90 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61  set for .  ** pa
30ea0 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74  ge pgno before t
30eb0 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74  he 'move' operat
30ec0 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f  ion, it needs to
30ed0 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20   be retained .  
30ee0 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  ** for the page 
30ef0 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a  moved there..  *
30f00 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26  /.  pPg->flags &
30f10 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  = ~PGHDR_NEED_SY
30f20 4e 43 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70  NC;.  pPgOld = p
30f30 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
30f40 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73  er, pgno);.  ass
30f50 65 72 74 28 20 21 70 50 67 4f 6c 64 20 7c 7c 20  ert( !pPgOld || 
30f60 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 31 20  pPgOld->nRef==1 
30f70 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20  );.  if( pPgOld 
30f80 29 7b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  ){.    pPg->flag
30f90 73 20 7c 3d 20 28 70 50 67 4f 6c 64 2d 3e 66 6c  s |= (pPgOld->fl
30fa0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
30fb0 59 4e 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  YNC);.    sqlite
30fc0 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 4f  3PcacheDrop(pPgO
30fd0 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20 6f 72 69 67  ld);.  }..  orig
30fe0 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Pgno = pPg->pgno
30ff0 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
31000 65 4d 6f 76 65 28 70 50 67 2c 20 70 67 6e 6f 29  eMove(pPg, pgno)
31010 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
31020 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b  eMakeDirty(pPg);
31030 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  .  pPager->dbMod
31040 69 66 69 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66  ified = 1;..  if
31050 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29  ( needSyncPgno )
31060 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64  {.    /* If need
31070 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d  SyncPgno is non-
31080 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a  zero, then the j
31090 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64  ournal file need
310a0 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20  s to be .    ** 
310b0 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20  sync()ed before 
310c0 61 6e 79 20 64 61 74 61 20 69 73 20 77 72 69 74  any data is writ
310d0 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20  ten to database 
310e0 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79  file page needSy
310f0 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43  ncPgno..    ** C
31100 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63  urrently, no suc
31110 68 20 70 61 67 65 20 65 78 69 73 74 73 20 69 6e  h page exists in
31120 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
31130 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  and the .    ** 
31140 22 69 73 20 6a 6f 75 72 6e 61 6c 65 64 22 20 62  "is journaled" b
31150 69 74 76 65 63 20 66 6c 61 67 20 68 61 73 20 62  itvec flag has b
31160 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65  een set. This ne
31170 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69  eds to be remedi
31180 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 6c 6f 61  ed by.    ** loa
31190 64 69 6e 67 20 74 68 65 20 70 61 67 65 20 69 6e  ding the page in
311a0 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  to the pager-cac
311b0 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74  he and setting t
311c0 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
311d0 63 20 0a 20 20 20 20 2a 2a 20 66 6c 61 67 2e 0a  c .    ** flag..
311e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
311f0 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
31200 6c 6f 61 64 20 74 68 65 20 70 61 67 65 20 69 6e  load the page in
31210 74 6f 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  to the page-cach
31220 65 20 66 61 69 6c 73 2c 20 28 64 75 65 0a 20 20  e fails, (due.  
31230 20 20 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63    ** to a malloc
31240 28 29 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65  () or IO failure
31250 29 2c 20 63 6c 65 61 72 20 74 68 65 20 62 69 74  ), clear the bit
31260 20 69 6e 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e   in the pInJourn
31270 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61  al[].    ** arra
31280 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  y. Otherwise, if
31290 20 74 68 65 20 70 61 67 65 20 69 73 20 6c 6f 61   the page is loa
312a0 64 65 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20  ded and written 
312b0 61 67 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20  again in.    ** 
312c0 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
312d0 2c 20 69 74 20 6d 61 79 20 62 65 20 77 72 69 74  , it may be writ
312e0 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
312f0 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a  ase file before.
31300 20 20 20 20 2a 2a 20 69 74 20 69 73 20 73 79 6e      ** it is syn
31310 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ced into the jou
31320 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
31330 77 61 79 2c 20 69 74 20 6d 61 79 20 65 6e 64 20  way, it may end 
31340 75 70 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  up in.    ** the
31350 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 77   journal file tw
31360 69 63 65 2c 20 62 75 74 20 74 68 61 74 20 69 73  ice, but that is
31370 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a   not a problem..
31380 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
31390 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  e sqlite3PagerGe
313a0 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75  t() call may cau
313b0 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  se the journal t
313c0 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a  o sync. So make.
313d0 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20      ** sure the 
313e0 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66  Pager.needSync f
313f0 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a  lag is set too..
31400 20 20 20 20 2a 2f 0a 20 20 20 20 50 67 48 64 72      */.    PgHdr
31410 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73   *pPgHdr;.    as
31420 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
31430 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63  edSync );.    rc
31440 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
31450 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53  et(pPager, needS
31460 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72  yncPgno, &pPgHdr
31470 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
31480 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31490 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
314a0 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 6e 65 65 64  nJournal && need
314b0 53 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65 72  SyncPgno<=pPager
314c0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a  ->dbOrigSize ){.
314d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
314e0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
314f0 65 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  e!=0 );.        
31500 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 6c 65  sqlite3BitvecCle
31510 61 72 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  ar(pPager->pInJo
31520 75 72 6e 61 6c 2c 20 6e 65 65 64 53 79 6e 63 50  urnal, needSyncP
31530 67 6e 6f 2c 20 70 50 61 67 65 72 2d 3e 70 54 6d  gno, pPager->pTm
31540 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 7d  pSpace);.      }
31550 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
31560 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
31570 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
31580 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
31590 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20  ager->noSync==0 
315a0 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  && !MEMDB );.   
315b0 20 70 50 67 48 64 72 2d 3e 66 6c 61 67 73 20 7c   pPgHdr->flags |
315c0 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
315d0 43 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  C;.    sqlite3Pc
315e0 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
315f0 67 48 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  gHdr);.    sqlit
31600 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
31610 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  Hdr);.  }..  /*.
31620 20 20 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d    ** For an in-m
31630 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
31640 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72  make sure the or
31650 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
31660 69 6e 75 65 73 0a 20 20 2a 2a 20 74 6f 20 65 78  inues.  ** to ex
31670 69 73 74 2c 20 69 6e 20 63 61 73 65 20 74 68 65  ist, in case the
31680 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65   transaction nee
31690 64 73 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e  ds to roll back.
316a0 20 20 57 65 20 61 6c 6c 6f 63 61 74 65 0a 20 20    We allocate.  
316b0 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 6f 77 2c  ** the page now,
316c0 20 69 6e 73 74 65 61 64 20 6f 66 20 61 74 20 72   instead of at r
316d0 6f 6c 6c 62 61 63 6b 2c 20 62 65 63 61 75 73 65  ollback, because
316e0 20 77 65 20 63 61 6e 20 62 65 74 74 65 72 20 64   we can better d
316f0 65 61 6c 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e  eal.  ** with an
31700 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65   out-of-memory e
31710 72 72 6f 72 20 6e 6f 77 2e 20 20 54 69 63 6b 65  rror now.  Ticke
31720 74 20 23 33 37 36 31 2e 0a 20 20 2a 2f 0a 20 20  t #3761..  */.  
31730 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
31740 20 44 62 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20   DbPage *pNew;. 
31750 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
31760 61 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67  agerAcquire(pPag
31770 65 72 2c 20 6f 72 69 67 50 67 6e 6f 2c 20 26 70  er, origPgno, &p
31780 4e 65 77 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  New, 1);.    if(
31790 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
317a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
317b0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
317c0 66 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20  f(pNew);.  }..  
317d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
317e0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
317f0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
31800 65 72 20 74 6f 20 74 68 65 20 64 61 74 61 20 66  er to the data f
31810 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
31820 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a   page..*/.void *
31830 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
31840 61 74 61 28 44 62 50 61 67 65 20 2a 70 50 67 29  ata(DbPage *pPg)
31850 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  {.  assert( pPg-
31860 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 50 67 2d 3e  >nRef>0 || pPg->
31870 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 3b  pPager->memDb );
31880 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70  .  return pPg->p
31890 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Data;.}../*.** R
318a0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
318b0 74 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78  to the Pager.nEx
318c0 74 72 61 20 62 79 74 65 73 20 6f 66 20 22 65 78  tra bytes of "ex
318d0 74 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61  tra" space .** a
318e0 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77  llocated along w
318f0 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65  ith the specifie
31900 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20  d page..*/.void 
31910 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  *sqlite3PagerGet
31920 45 78 74 72 61 28 44 62 50 61 67 65 20 2a 70 50  Extra(DbPage *pP
31930 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
31940 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
31950 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61  r;.  return (pPa
31960 67 65 72 3f 70 50 67 2d 3e 70 45 78 74 72 61 3a  ger?pPg->pExtra:
31970 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  0);.}../*.** Get
31980 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67  /set the locking
31990 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70  -mode for this p
319a0 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20  ager. Parameter 
319b0 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
319c0 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f  e.** of PAGER_LO
319d0 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c  CKINGMODE_QUERY,
319e0 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
319f0 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a  DE_NORMAL or .**
31a00 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
31a10 44 45 5f 45 58 43 4c 55 53 49 56 45 2e 20 49 66  DE_EXCLUSIVE. If
31a20 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69   the parameter i
31a30 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68  s not _QUERY, th
31a40 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e  en.** the lockin
31a50 67 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f  g-mode is set to
31a60 20 74 68 65 20 76 61 6c 75 65 20 73 70 65 63 69   the value speci
31a70 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fied..**.** The 
31a80 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69  returned value i
31a90 73 20 65 69 74 68 65 72 20 50 41 47 45 52 5f 4c  s either PAGER_L
31aa0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
31ab0 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f  L or.** PAGER_LO
31ac0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
31ad0 49 56 45 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  IVE, indicating 
31ae0 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73  the current (pos
31af0 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a  sibly updated).*
31b00 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a  * locking-mode..
31b10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
31b20 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50  gerLockingMode(P
31b30 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
31b40 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65  t eMode){.  asse
31b50 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52  rt( eMode==PAGER
31b60 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
31b70 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  RY.            |
31b80 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  | eMode==PAGER_L
31b90 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
31ba0 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L.            ||
31bb0 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
31bc0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
31bd0 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IVE );.  assert(
31be0 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
31bf0 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20  DE_QUERY<0 );.  
31c00 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
31c10 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
31c20 3e 3d 30 20 26 26 20 50 41 47 45 52 5f 4c 4f 43  >=0 && PAGER_LOC
31c30 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
31c40 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 65  VE>=0 );.  if( e
31c50 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70 50 61 67  Mode>=0 && !pPag
31c60 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
31c70 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c      pPager->excl
31c80 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29  usiveMode = (u8)
31c90 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74  eMode;.  }.  ret
31ca0 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d  urn (int)pPager-
31cb0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a  >exclusiveMode;.
31cc0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74  }../*.** Get/set
31cd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
31ce0 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
31cf0 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64  . Parameter eMod
31d00 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  e must be one of
31d10 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50 41 47 45 52  :.**.**    PAGER
31d20 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45  _JOURNALMODE_QUE
31d30 52 59 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a  RY.**    PAGER_J
31d40 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
31d50 45 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f  E.**    PAGER_JO
31d60 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
31d70 54 45 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a  TE.**    PAGER_J
31d80 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
31d90 53 54 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a  ST.**    PAGER_J
31da0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a 2a  OURNALMODE_OFF.*
31db0 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e  *    PAGER_JOURN
31dc0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 0a 2a 2a  ALMODE_MEMORY.**
31dd0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 72 61 6d  .** If the param
31de0 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45  eter is not _QUE
31df0 52 59 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  RY, then the jou
31e00 72 6e 61 6c 5f 6d 6f 64 65 20 69 73 20 73 65 74  rnal_mode is set
31e10 20 74 6f 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65   to the.** value
31e20 20 73 70 65 63 69 66 69 65 64 20 69 66 20 74 68   specified if th
31e30 65 20 63 68 61 6e 67 65 20 69 73 20 61 6c 6c 6f  e change is allo
31e40 77 65 64 2e 20 20 54 68 65 20 63 68 61 6e 67 65  wed.  The change
31e50 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 0a 2a   is disallowed.*
31e60 2a 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77  * for the follow
31e70 69 6e 67 20 72 65 61 73 6f 6e 73 3a 0a 2a 2a 0a  ing reasons:.**.
31e80 2a 2a 20 20 20 2a 20 20 41 6e 20 69 6e 2d 6d 65  **   *  An in-me
31e90 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 63 61  mory database ca
31ea0 6e 20 6f 6e 6c 79 20 68 61 76 65 20 69 74 73 20  n only have its 
31eb0 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 73 65 74  journal_mode set
31ec0 20 74 6f 20 5f 4f 46 46 0a 2a 2a 20 20 20 20 20   to _OFF.**     
31ed0 20 6f 72 20 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a   or _MEMORY..**.
31ee0 2a 2a 20 20 20 2a 20 20 54 68 65 20 6a 6f 75 72  **   *  The jour
31ef0 6e 61 6c 20 6d 6f 64 65 20 6d 61 79 20 6e 6f 74  nal mode may not
31f00 20 62 65 20 63 68 61 6e 67 65 64 20 77 68 69 6c   be changed whil
31f10 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  e a transaction 
31f20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a  is active..**.**
31f30 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 69 6e   The returned in
31f40 64 69 63 61 74 65 20 74 68 65 20 63 75 72 72 65  dicate the curre
31f50 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64  nt (possibly upd
31f60 61 74 65 64 29 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  ated) journal-mo
31f70 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
31f80 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f  e3PagerJournalMo
31f90 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  de(Pager *pPager
31fa0 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20  , int eMode){.  
31fb0 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50  assert( eMode==P
31fc0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
31fd0 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20  _QUERY.         
31fe0 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
31ff0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
32000 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20 20 20  ELETE.          
32010 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
32020 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
32030 55 4e 43 41 54 45 0a 20 20 20 20 20 20 20 20 20  UNCATE.         
32040 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
32050 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
32060 45 52 53 49 53 54 0a 20 20 20 20 20 20 20 20 20  ERSIST.         
32070 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
32080 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
32090 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  FF .            
320a0 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
320b0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
320c0 52 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  RY );.  assert( 
320d0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
320e0 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 69  E_QUERY<0 );.  i
320f0 66 28 20 65 4d 6f 64 65 3e 3d 30 0a 20 20 20 26  f( eMode>=0.   &
32100 26 20 28 21 4d 45 4d 44 42 20 7c 7c 20 65 4d 6f  & (!MEMDB || eMo
32110 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
32120 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20  LMODE_MEMORY .  
32130 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
32140 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
32150 4e 41 4c 4d 4f 44 45 5f 4f 46 46 29 0a 20 20 20  NALMODE_OFF).   
32160 26 26 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f  && !pPager->dbMo
32170 64 69 66 69 65 64 0a 20 20 20 26 26 20 28 21 69  dified.   && (!i
32180 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
32190 64 29 20 7c 7c 20 30 3d 3d 70 50 61 67 65 72 2d  d) || 0==pPager-
321a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 0a 20 20 29  >journalOff).  )
321b0 7b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  {.    if( isOpen
321c0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
321d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
321e0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
321f0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  d);.    }.    pP
32200 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
32210 65 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20  e = (u8)eMode;. 
32220 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74   }.  return (int
32230 29 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  )pPager->journal
32240 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Mode;.}../*.** G
32250 65 74 2f 73 65 74 20 74 68 65 20 73 69 7a 65 2d  et/set the size-
32260 6c 69 6d 69 74 20 75 73 65 64 20 66 6f 72 20 70  limit used for p
32270 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61  ersistent journa
32280 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53  l files..**.** S
32290 65 74 74 69 6e 67 20 74 68 65 20 73 69 7a 65 20  etting the size 
322a0 6c 69 6d 69 74 20 74 6f 20 2d 31 20 6d 65 61 6e  limit to -1 mean
322b0 73 20 6e 6f 20 6c 69 6d 69 74 20 69 73 20 65 6e  s no limit is en
322c0 66 6f 72 63 65 64 2e 0a 2a 2a 20 41 6e 20 61 74  forced..** An at
322d0 74 65 6d 70 74 20 74 6f 20 73 65 74 20 61 20 6c  tempt to set a l
322e0 69 6d 69 74 20 73 6d 61 6c 6c 65 72 20 74 68 61  imit smaller tha
322f0 6e 20 2d 31 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  n -1 is a no-op.
32300 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 50  .*/.i64 sqlite3P
32310 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c  agerJournalSizeL
32320 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  imit(Pager *pPag
32330 65 72 2c 20 69 36 34 20 69 4c 69 6d 69 74 29 7b  er, i64 iLimit){
32340 0a 20 20 69 66 28 20 69 4c 69 6d 69 74 3e 3d 2d  .  if( iLimit>=-
32350 31 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  1 ){.    pPager-
32360 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
32370 74 20 3d 20 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a  t = iLimit;.  }.
32380 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
32390 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
323a0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
323b0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
323c0 74 68 65 20 70 50 61 67 65 72 2d 3e 70 42 61 63  the pPager->pBac
323d0 6b 75 70 20 76 61 72 69 61 62 6c 65 2e 20 54 68  kup variable. Th
323e0 65 20 62 61 63 6b 75 70 20 6d 6f 64 75 6c 65 0a  e backup module.
323f0 2a 2a 20 69 6e 20 62 61 63 6b 75 70 2e 63 20 6d  ** in backup.c m
32400 61 69 6e 74 61 69 6e 73 20 74 68 65 20 63 6f 6e  aintains the con
32410 74 65 6e 74 20 6f 66 20 74 68 69 73 20 76 61 72  tent of this var
32420 69 61 62 6c 65 2e 20 54 68 69 73 20 6d 6f 64 75  iable. This modu
32430 6c 65 0a 2a 2a 20 75 73 65 73 20 69 74 20 6f 70  le.** uses it op
32440 61 71 75 65 6c 79 20 61 73 20 61 6e 20 61 72 67  aquely as an arg
32450 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33  ument to sqlite3
32460 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 29 20  BackupRestart() 
32470 61 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33 42 61  and.** sqlite3Ba
32480 63 6b 75 70 55 70 64 61 74 65 28 29 20 6f 6e 6c  ckupUpdate() onl
32490 79 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 62 61  y..*/.sqlite3_ba
324a0 63 6b 75 70 20 2a 2a 73 71 6c 69 74 65 33 50 61  ckup **sqlite3Pa
324b0 67 65 72 42 61 63 6b 75 70 50 74 72 28 50 61 67  gerBackupPtr(Pag
324c0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
324d0 65 74 75 72 6e 20 26 70 50 61 67 65 72 2d 3e 70  eturn &pPager->p
324e0 42 61 63 6b 75 70 3b 0a 7d 0a 0a 23 65 6e 64 69  Backup;.}..#endi
324f0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
32500 5f 44 49 53 4b 49 4f 20 2a 2f 0a                 _DISKIO */.