/ Hex Artifact Content
Login

Artifact c1b13280e111d33625b94a8391eb0c3c94a8384d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 36 31  : pager.c,v 1.61
0350: 32 20 32 30 30 39 2f 30 37 2f 32 32 20 31 33 3a  2 2009/07/22 13:
0360: 31 39 3a 32 30 20 64 72 68 20 45 78 70 20 24 0a  19:20 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72  t.h"../*.** Macr
03b0: 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68  os for troublesh
03c0: 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61 6c 6c  ooting.  Normall
03d0: 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a  y turned off.*/.
03e0: 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69 74 65  #if 0.int sqlite
03f0: 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b 20 20  3PagerTrace=1;  
0400: 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61 62 6c  /* True to enabl
0410: 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 64 65  e tracing */.#de
0420: 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65 62 75  fine sqlite3Debu
0430: 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66 0a 23  gPrintf printf.#
0440: 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43  define PAGERTRAC
0450: 45 28 58 29 20 20 20 20 20 69 66 28 20 73 71 6c  E(X)     if( sql
0460: 69 74 65 33 50 61 67 65 72 54 72 61 63 65 20 29  ite3PagerTrace )
0470: 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72  { sqlite3DebugPr
0480: 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73 65 0a  intf X; }.#else.
0490: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
04a0: 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  CE(X).#endif../*
04b0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
04c0: 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61 72 65  g two macros are
04d0: 20 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65   used within the
04e0: 20 50 41 47 45 52 54 52 41 43 45 28 29 20 6d 61   PAGERTRACE() ma
04f0: 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f  cros above.** to
0500: 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d   print out file-
0510: 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a  descriptors. .**
0520: 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20 74 61  .** PAGERID() ta
0530: 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  kes a pointer to
0540: 20 61 20 50 61 67 65 72 20 73 74 72 75 63 74 20   a Pager struct 
0550: 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74 2e  as its argument.
0560: 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74   The.** associat
0570: 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ed file-descript
0580: 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  or is returned. 
0590: 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29 20 74  FILEHANDLEID() t
05a0: 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65 33 5f  akes an sqlite3_
05b0: 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 20 61  file.** struct a
05c0: 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74 2e 0a  s its argument..
05d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
05e0: 49 44 28 70 29 20 28 28 69 6e 74 29 28 70 2d 3e  ID(p) ((int)(p->
05f0: 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46 49 4c  fd)).#define FIL
0600: 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28 28  EHANDLEID(fd) ((
0610: 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54  int)fd)../*.** T
0620: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73  he page cache as
0630: 20 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61   a whole is alwa
0640: 79 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  ys in one of the
0650: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74   following.** st
0660: 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41  ates:.**.**   PA
0670: 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20  GER_UNLOCK      
0680: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
0690: 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
06a0: 79 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a  y reading or .**
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06c0: 20 20 20 20 20 20 20 77 72 69 74 69 6e 67 20 74         writing t
06d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
06e0: 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a  .  There is no.*
06f0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0700: 20 20 20 20 20 20 20 20 64 61 74 61 20 68 65 6c          data hel
0710: 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68  d in memory.  Th
0720: 69 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  is is the initia
0730: 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
0740: 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65             state
0750: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0760: 53 48 41 52 45 44 20 20 20 20 20 20 20 20 54 68  SHARED        Th
0770: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0780: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0790: 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  base..**        
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
07b0: 72 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65  riting is not pe
07c0: 72 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20  rmitted.  There 
07d0: 63 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20  can be.**       
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73  multiple readers
0800: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73   accessing the s
0810: 61 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ame database.** 
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68        file at th
0840: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a  e same time..**.
0850: 2a 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52  **   PAGER_RESER
0860: 56 45 44 20 20 20 20 20 20 54 68 69 73 20 70 72  VED      This pr
0870: 6f 63 65 73 73 20 68 61 73 20 72 65 73 65 72 76  ocess has reserv
0880: 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
0890: 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20  for writing.**  
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 20 20 20 62 75 74 20 68 61 73 20 6e 6f 74       but has not
08c0: 20 79 65 74 20 6d 61 64 65 20 61 6e 79 20 63 68   yet made any ch
08d0: 61 6e 67 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65  anges.  Only one
08e0: 20 70 72 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20   process.**     
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 61 74 20 61 20 74 69 6d 65 20 63 61 6e 20    at a time can 
0910: 72 65 73 65 72 76 65 20 74 68 65 20 64 61 74 61  reserve the data
0920: 62 61 73 65 2e 20 20 54 68 65 20 6f 72 69 67 69  base.  The origi
0930: 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  nal.**          
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0950: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e  abase file has n
0960: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
0970: 20 73 6f 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20   so other.**    
0980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0990: 20 20 20 70 72 6f 63 65 73 73 65 73 20 6d 61 79     processes may
09a0: 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e   still be readin
09b0: 67 20 74 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a  g the on-disk.**
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09d0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
09e0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  file..**.**   PA
09f0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20  GER_EXCLUSIVE   
0a00: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
0a10: 20 69 73 20 77 72 69 74 69 6e 67 20 74 68 65 20   is writing the 
0a20: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20  database..**    
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a40: 20 20 20 41 63 63 65 73 73 20 69 73 20 65 78 63     Access is exc
0a50: 6c 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65  lusive.  No othe
0a60: 72 20 70 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a  r processes or.*
0a70: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0a80: 20 20 20 20 20 20 20 20 74 68 72 65 61 64 73 20          threads 
0a90: 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 6f  can be reading o
0aa0: 72 20 77 72 69 74 69 6e 67 20 77 68 69 6c 65 20  r writing while 
0ab0: 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  one.**          
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f               pro
0ad0: 63 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 2e  cess is writing.
0ae0: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53  .**.**   PAGER_S
0af0: 59 4e 43 45 44 20 20 20 20 20 20 20 20 54 68 65  YNCED        The
0b00: 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20   pager moves to 
0b10: 74 68 69 73 20 73 74 61 74 65 20 66 72 6f 6d 20  this state from 
0b20: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 0a  PAGER_EXCLUSIVE.
0b30: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0b40: 20 20 20 20 20 20 20 20 20 61 66 74 65 72 20 61           after a
0b50: 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 68  ll dirty pages h
0b60: 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
0b70: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
0ba0: 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  nd the file has 
0bb0: 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a  been synced to.*
0bc0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0bd0: 20 20 20 20 20 20 20 20 64 69 73 6b 2e 20 41 6c          disk. Al
0be0: 6c 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74  l that remains t
0bf0: 6f 20 64 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76  o do is to remov
0c00: 65 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  e or.**         
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
0c20: 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
0c30: 61 6c 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  al file and the 
0c40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c60: 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20 63 6f        will be co
0c70: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  mmitted..**.** T
0c80: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 63 6f  he page cache co
0c90: 6d 65 73 20 75 70 20 69 6e 20 50 41 47 45 52 5f  mes up in PAGER_
0ca0: 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72  UNLOCK.  The fir
0cb0: 73 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c  st time a.** sql
0cc0: 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 6f  ite3PagerGet() o
0cd0: 63 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65  ccurs, the state
0ce0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20   transitions to 
0cf0: 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a  PAGER_SHARED..**
0d00: 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73   After all pages
0d10: 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61   have been relea
0d20: 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  sed using sqlite
0d30: 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a  _page_unref(),.*
0d40: 2a 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e  * the state tran
0d50: 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20  sitions back to 
0d60: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54  PAGER_UNLOCK.  T
0d70: 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a  he first time.**
0d80: 20 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67   that sqlite3Pag
0d90: 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
0da0: 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65 20 74  led, the state t
0db0: 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a  ransitions to.**
0dc0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
0dd0: 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73 71 6c    (Note that sql
0de0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
0df0: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20   can only be.** 
0e00: 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74  called on an out
0e10: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 77 68  standing page wh
0e20: 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ich means that t
0e30: 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a  he pager must.**
0e40: 20 62 65 20 69 6e 20 50 41 47 45 52 5f 53 48 41   be in PAGER_SHA
0e50: 52 45 44 20 62 65 66 6f 72 65 20 69 74 20 74 72  RED before it tr
0e60: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47  ansitions to PAG
0e70: 45 52 5f 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a  ER_RESERVED.).**
0e80: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
0e90: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65  means that there
0ea0: 20 69 73 20 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c   is an open roll
0eb0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  back journal..**
0ec0: 20 54 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20   The transition 
0ed0: 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  to PAGER_EXCLUSI
0ee0: 56 45 20 6f 63 63 75 72 73 20 62 65 66 6f 72 65  VE occurs before
0ef0: 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20   any changes.** 
0f00: 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
0f10: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
0f20: 68 6f 75 67 68 20 77 72 69 74 65 73 20 74 6f 20  hough writes to 
0f30: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  the rollback.** 
0f40: 6a 6f 75 72 6e 61 6c 20 6f 63 63 75 72 73 20 77  journal occurs w
0f50: 69 74 68 20 6a 75 73 74 20 50 41 47 45 52 5f 52  ith just PAGER_R
0f60: 45 53 45 52 56 45 44 2e 20 20 41 66 74 65 72 20  ESERVED.  After 
0f70: 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  an sqlite3PagerR
0f80: 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20  ollback().** or 
0f90: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
0fa0: 69 74 50 68 61 73 65 54 77 6f 28 29 2c 20 74 68  itPhaseTwo(), th
0fb0: 65 20 73 74 61 74 65 20 63 61 6e 20 67 6f 20 62  e state can go b
0fc0: 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ack to PAGER_SHA
0fd0: 52 45 44 2c 0a 2a 2a 20 6f 72 20 69 74 20 63 61  RED,.** or it ca
0fe0: 6e 20 73 74 61 79 20 61 74 20 50 41 47 45 52 5f  n stay at PAGER_
0ff0: 45 58 43 4c 55 53 49 56 45 20 69 66 20 77 65 20  EXCLUSIVE if we 
1000: 61 72 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65  are in exclusive
1010: 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f   access mode..*/
1020: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 55  .#define PAGER_U
1030: 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23 64 65  NLOCK      0.#de
1040: 66 69 6e 65 20 50 41 47 45 52 5f 53 48 41 52 45  fine PAGER_SHARE
1050: 44 20 20 20 20 20 20 31 20 20 20 2f 2a 20 73 61  D      1   /* sa
1060: 6d 65 20 61 73 20 53 48 41 52 45 44 5f 4c 4f 43  me as SHARED_LOC
1070: 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  K */.#define PAG
1080: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 32  ER_RESERVED    2
1090: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 52 45     /* same as RE
10a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23  SERVED_LOCK */.#
10b0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 58 43  define PAGER_EXC
10c0: 4c 55 53 49 56 45 20 20 20 34 20 20 20 2f 2a 20  LUSIVE   4   /* 
10d0: 73 61 6d 65 20 61 73 20 45 58 43 4c 55 53 49 56  same as EXCLUSIV
10e0: 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e  E_LOCK */.#defin
10f0: 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20  e PAGER_SYNCED  
1100: 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d      5../*.** A m
1110: 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69 6e  acro used for in
1120: 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65 63  voking the codec
1130: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
1140: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1150: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64 65  E_HAS_CODEC.# de
1160: 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c  fine CODEC1(P,D,
1170: 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69 66 28  N,X,E) \.    if(
1180: 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20 50 2d   P->xCodec && P-
1190: 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65  >xCodec(P->pCode
11a0: 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b 20 45  c,D,N,X)==0 ){ E
11b0: 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  ; }.# define COD
11c0: 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29  EC2(P,D,N,X,E,O)
11d0: 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e 78 43   \.    if( P->xC
11e0: 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28 63 68  odec==0 ){ O=(ch
11f0: 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c 0a 20  ar*)D; }else \. 
1200: 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61 72 2a     if( (O=(char*
1210: 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70  )(P->xCodec(P->p
1220: 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29 3d 3d  Codec,D,N,X)))==
1230: 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73 65 0a  0 ){ E; }.#else.
1240: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28  # define CODEC1(
1250: 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f 2a 20  P,D,N,X,E)   /* 
1260: 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e  NO-OP */.# defin
1270: 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58  e CODEC2(P,D,N,X
1280: 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a 29 44  ,E,O) O=(char*)D
1290: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
12a0: 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77  he maximum allow
12b0: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20  ed sector size. 
12c0: 31 36 4d 42 2e 20 49 66 20 74 68 65 20 78 53 65  16MB. If the xSe
12d0: 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74 68 6f  ctorsize() metho
12e0: 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  d .** returns a 
12f0: 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74 68 61  value larger tha
1300: 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d 41 58  n this, then MAX
1310: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 73 20  _SECTOR_SIZE is 
1320: 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  used instead..**
1330: 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f 6e 63   This could conc
1340: 65 69 76 61 62 6c 79 20 63 61 75 73 65 20 63 6f  eivably cause co
1350: 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f 77 69  rruption followi
1360: 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  ng a power failu
1370: 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20 61 20  re on.** such a 
1380: 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69 73 20  system. This is 
1390: 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75 6e 64  currently an und
13a0: 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69 74 2e  ocumented limit.
13b0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f  .*/.#define MAX_
13c0: 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78 30 31  SECTOR_SIZE 0x01
13d0: 30 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  00000../*.** An 
13e0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
13f0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
1400: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
1410: 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76 65   for each active
1420: 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61 6e  .** savepoint an
1430: 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  d statement tran
1440: 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73  saction in the s
1450: 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68 20  ystem. All such 
1460: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61 72  structures.** ar
1470: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
1480: 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
1490: 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  [] array, which 
14a0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
14b0: 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69 6e  .** resized usin
14c0: 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  g sqlite3Realloc
14d0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  ()..**.** When a
14e0: 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63 72   savepoint is cr
14f0: 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65 72  eated, the Pager
1500: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
1510: 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a 2a  fset field is.**
1520: 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61 20   set to 0. If a 
1530: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
1540: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
1550: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
1560: 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61 76  while.** the sav
1570: 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
1580: 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73 65  , then iHdrOffse
1590: 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
15a0: 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a 20  byte offset .** 
15b0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
15c0: 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 6a  owing the last j
15d0: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 72  ournal record wr
15e0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d  itten into the m
15f0: 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 62  ain.** journal b
1600: 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e 61  efore the journa
1610: 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20 69  l-header. This i
1620: 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69 6e  s required durin
1630: 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 72  g savepoint.** r
1640: 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61 67  ollback (see pag
1650: 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
1660: 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65 64  int())..*/.typed
1670: 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72 53  ef struct PagerS
1680: 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53 61  avepoint PagerSa
1690: 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74 20  vepoint;.struct 
16a0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 7b  PagerSavepoint {
16b0: 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b 20  .  i64 iOffset; 
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d0: 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66 73  /* Starting offs
16e0: 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e  et in main journ
16f0: 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  al */.  i64 iHdr
1700: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
1710: 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f 76       /* See abov
1720: 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
1730: 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20  InSavepoint;    
1740: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70 61      /* Set of pa
1750: 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76 65  ges in this save
1760: 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  point */.  Pgno 
1770: 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20  nOrig;          
1780: 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
1790: 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  nal number of pa
17a0: 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a 20  ges in file */. 
17b0: 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20 20   Pgno iSubRec;  
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17d0: 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
17e0: 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a 6f  record in sub-jo
17f0: 75 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  urnal */.};../*.
1800: 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63  ** A open page c
1810: 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61  ache is an insta
1820: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
1830: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
1840: 2a 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a  **.** errCode.**
1850: 0a 2a 2a 20 20 20 50 61 67 65 72 2e 65 72 72 43  .**   Pager.errC
1860: 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20 74  ode may be set t
1870: 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  o SQLITE_IOERR, 
1880: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20  SQLITE_CORRUPT, 
1890: 6f 72 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49 54  or.**   or SQLIT
18a0: 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65  E_FULL. Once one
18b0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68   of the first th
18c0: 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72  ree errors occur
18d0: 73 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a  s, it persists.*
18e0: 2a 20 20 20 61 6e 64 20 69 73 20 72 65 74 75 72  *   and is retur
18f0: 6e 65 64 20 61 73 20 74 68 65 20 72 65 73 75 6c  ned as the resul
1900: 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72  t of every major
1910: 20 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e   pager API call.
1920: 20 20 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49 54    The.**   SQLIT
1930: 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f  E_FULL return co
1940: 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64  de is slightly d
1950: 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72  ifferent. It per
1960: 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c  sists only until
1970: 20 74 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20 73   the.**   next s
1980: 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61  uccessful rollba
1990: 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20  ck is performed 
19a0: 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  on the pager cac
19b0: 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20 53  he. Also,.**   S
19c0: 51 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20  QLITE_FULL does 
19d0: 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 73  not affect the s
19e0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
19f0: 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65   and sqlite3Page
1a00: 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20 41  rLookup().**   A
1a10: 50 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74  PIs, they may st
1a20: 69 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63 63  ill be used succ
1a30: 65 73 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20  essfully..**.** 
1a40: 64 62 53 69 7a 65 56 61 6c 69 64 2c 20 64 62 53  dbSizeValid, dbS
1a50: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 2c  ize, dbOrigSize,
1a60: 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a 2a   dbFileSize.**.*
1a70: 2a 20 20 20 4d 61 6e 61 67 69 6e 67 20 74 68 65  *   Managing the
1a80: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1a90: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61  abase file in pa
1aa0: 67 65 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20  ges is a little 
1ab0: 63 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 20  complicated..** 
1ac0: 20 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 50    The variable P
1ad0: 61 67 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e 74  ager.dbSize cont
1ae0: 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ains the number 
1af0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68  of pages that th
1b00: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
1b10: 69 6d 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20  image currently 
1b20: 63 6f 6e 74 61 69 6e 73 2e 20 41 73 20 74 68 65  contains. As the
1b30: 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
1b40: 67 72 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b 73  grows or shrinks
1b50: 20 74 68 69 73 0a 2a 2a 20 20 20 76 61 72 69 61   this.**   varia
1b60: 62 6c 65 20 69 73 20 75 70 64 61 74 65 64 2e 20  ble is updated. 
1b70: 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61 67  The variable Pag
1b80: 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 63 6f  er.dbFileSize co
1b90: 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65  ntains the numbe
1ba0: 72 0a 2a 2a 20 20 20 6f 66 20 70 61 67 65 73 20  r.**   of pages 
1bb0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1bc0: 66 69 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 62  file. This may b
1bd0: 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
1be0: 20 50 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a 2a   Pager.dbSize.**
1bf0: 20 20 20 69 66 20 73 6f 6d 65 20 70 61 67 65 73     if some pages
1c00: 20 68 61 76 65 20 62 65 65 6e 20 61 70 70 65 6e   have been appen
1c10: 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62  ded to the datab
1c20: 61 73 65 20 69 6d 61 67 65 20 62 75 74 20 6e 6f  ase image but no
1c30: 74 20 79 65 74 20 77 72 69 74 74 65 6e 0a 2a 2a  t yet written.**
1c40: 20 20 20 6f 75 74 20 66 72 6f 6d 20 74 68 65 20     out from the 
1c50: 63 61 63 68 65 20 74 6f 20 74 68 65 20 61 63 74  cache to the act
1c60: 75 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ual file on disk
1c70: 2e 20 4f 72 20 69 66 20 74 68 65 20 69 6d 61 67  . Or if the imag
1c80: 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20  e has been.**   
1c90: 74 72 75 6e 63 61 74 65 64 20 62 79 20 61 6e 20  truncated by an 
1ca0: 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
1cb0: 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68  um operation. Th
1cc0: 65 20 50 61 67 65 72 2e 64 62 4f 72 69 67 53 69  e Pager.dbOrigSi
1cd0: 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20  ze variable.**  
1ce0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75   contains the nu
1cf0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1d00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
1d10: 61 67 65 20 77 68 65 6e 20 74 68 65 20 63 75 72  age when the cur
1d20: 72 65 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73 61  rent.**   transa
1d30: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
1d40: 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  . The contents o
1d50: 66 20 61 6c 6c 20 74 68 72 65 65 20 6f 66 20 74  f all three of t
1d60: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 69  hese variables i
1d70: 73 0a 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61 72  s.**   only guar
1d80: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 63 6f 72  anteed to be cor
1d90: 72 65 63 74 20 69 66 20 74 68 65 20 62 6f 6f 6c  rect if the bool
1da0: 65 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  ean Pager.dbSize
1db0: 56 61 6c 69 64 20 69 73 20 74 72 75 65 2e 0a 2a  Valid is true..*
1dc0: 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e 64  *.**   TODO: Und
1dd0: 65 72 20 77 68 61 74 20 63 6f 6e 64 69 74 69 6f  er what conditio
1de0: 6e 73 20 69 73 20 64 62 53 69 7a 65 56 61 6c 69  ns is dbSizeVali
1df0: 64 20 73 65 74 3f 20 43 6c 65 61 72 65 64 3f 0a  d set? Cleared?.
1e00: 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e  **.** changeCoun
1e10: 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  tDone.**.**   Th
1e20: 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  is boolean varia
1e30: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ble is used to m
1e40: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
1e50: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1e60: 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79   .**   (the 4-by
1e70: 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  te header field 
1e80: 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32  at byte offset 2
1e90: 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  4 of the databas
1ea0: 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20  e file) is .**  
1eb0: 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72   not updated mor
1ec0: 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63  e often than nec
1ed0: 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20  essary. .**.**  
1ee0: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72   It is set to tr
1ef0: 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e  ue when the chan
1f00: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
1f10: 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69   is updated, whi
1f20: 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c  ch .**   can onl
1f30: 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65  y happen if an e
1f40: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
1f50: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1f60: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
1f70: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28   It is cleared (
1f80: 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68  set to false) wh
1f90: 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73  enever an exclus
1fa0: 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  ive lock is .** 
1fb0: 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f    relinquished o
1fc0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1fd0: 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61  ile. Each time a
1fe0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1ff0: 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20  committed,.**   
2000: 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  The changeCountD
2010: 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70  one flag is insp
2020: 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20  ected. If it is 
2030: 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f  true, the work o
2040: 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20  f.**   updating 
2050: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
2060: 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f  er is omitted fo
2070: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  r the current tr
2080: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
2090: 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73     This mechanis
20a0: 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65  m means that whe
20b0: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  n running in exc
20c0: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63  lusive mode, a c
20d0: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  onnection .**   
20e0: 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65  need only update
20f0: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
2100: 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68  ter once, for th
2110: 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74  e first transact
2120: 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74  ion.**   committ
2130: 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64 69  ed..**.** dbModi
2140: 66 69 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  fied.**.**   The
2150: 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67   dbModified flag
2160: 20 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72   is set whenever
2170: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
2180: 20 69 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a 20   is dirtied..** 
2190: 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20    It is cleared 
21a0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61  at the end of ea
21b0: 63 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ch transaction..
21c0: 2a 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 75 73  **.**   It is us
21d0: 65 64 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69  ed when committi
21e0: 6e 67 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20  ng or otherwise 
21f0: 65 6e 64 69 6e 67 20 61 20 74 72 61 6e 73 61 63  ending a transac
2200: 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74 68  tion. If.**   th
2210: 65 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61  e dbModified fla
2220: 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20  g is clear then 
2230: 6c 65 73 73 20 77 6f 72 6b 20 68 61 73 20 74 6f  less work has to
2240: 20 62 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   be done..**.** 
2250: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 0a 2a  journalStarted.*
2260: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 66 6c 61 67  *.**   This flag
2270: 20 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72   is set whenever
2280: 20 74 68 65 20 74 68 65 20 6d 61 69 6e 20 6a 6f   the the main jo
2290: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2e  urnal is synced.
22a0: 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 70 6f   .**.**   The po
22b0: 69 6e 74 20 6f 66 20 74 68 69 73 20 66 6c 61 67  int of this flag
22c0: 20 69 73 20 74 68 61 74 20 69 74 20 6d 75 73 74   is that it must
22d0: 20 62 65 20 73 65 74 20 61 66 74 65 72 20 74 68   be set after th
22e0: 65 20 0a 2a 2a 20 20 20 66 69 72 73 74 20 6a 6f  e .**   first jo
22f0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20  urnal header in 
2300: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  a journal file h
2310: 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74  as been synced t
2320: 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41 66 74  o disk..**   Aft
2330: 65 72 20 74 68 69 73 20 68 61 73 20 68 61 70 70  er this has happ
2340: 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65 73 20  ened, new pages 
2350: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
2360: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 64  database .**   d
2370: 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20 50  o not need the P
2380: 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
2390: 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68 65 79  lag set, as they
23a0: 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a 20   do not need.** 
23b0: 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61 20    to wait for a 
23c0: 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62 65 66  journal sync bef
23d0: 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62 65 20  ore they can be 
23e0: 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 2a  written out to.*
23f0: 2a 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65  *   the database
2400: 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e 63 74   file (see funct
2410: 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74 65 28  ion pager_write(
2420: 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73 65 74  ))..**   .** set
2430: 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 54  Master.**.**   T
2440: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
2450: 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  used to ensure t
2460: 68 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a  hat the master j
2470: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
2480: 0a 2a 2a 20 20 20 28 69 66 20 61 6e 79 29 20 69  .**   (if any) i
2490: 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e 20 69  s only written i
24a0: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
24b0: 66 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a 2a 2a  file once..**.**
24c0: 20 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74 74 69     When committi
24d0: 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
24e0: 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  , the master jou
24f0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 28  rnal file name (
2500: 69 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d 61 79  if any).**   may
2510: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
2520: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2530: 65 20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65  e while the page
2540: 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a 2a 2a  r is still in.**
2550: 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56 45     PAGER_RESERVE
2560: 44 20 73 74 61 74 65 20 28 73 65 65 20 43 6f 6d  D state (see Com
2570: 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 66 6f  mitPhaseOne() fo
2580: 72 20 74 68 65 20 61 63 74 69 6f 6e 29 2e 20 49  r the action). I
2590: 74 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74 74 65  t.**   then atte
25a0: 6d 70 74 73 20 74 6f 20 75 70 67 72 61 64 65 20  mpts to upgrade 
25b0: 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  to an exclusive 
25c0: 6c 6f 63 6b 2e 20 49 66 20 74 68 69 73 20 61 74  lock. If this at
25d0: 74 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69 6c 73  tempt.**   fails
25e0: 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 42 55  , then SQLITE_BU
25f0: 53 59 20 6d 61 79 20 62 65 20 72 65 74 75 72 6e  SY may be return
2600: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20 61  ed to the user a
2610: 6e 64 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 20  nd the user.**  
2620: 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f 20   may attempt to 
2630: 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
2640: 61 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61 74  action again lat
2650: 65 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a 20 20  er (calling.**  
2660: 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28   CommitPhaseOne(
2670: 29 20 61 67 61 69 6e 29 2e 20 54 68 69 73 20 66  ) again). This f
2680: 6c 61 67 20 69 73 20 75 73 65 64 20 74 6f 20 65  lag is used to e
2690: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 0a  nsure that the .
26a0: 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72  **   master jour
26b0: 6e 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e 6c 79  nal name is only
26c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
26d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
26e0: 20 66 69 72 73 74 0a 2a 2a 20 20 20 74 69 6d 65   first.**   time
26f0: 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28   CommitPhaseOne(
2700: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  ) is called..**.
2710: 2a 2a 20 64 6f 4e 6f 74 53 79 6e 63 0a 2a 2a 0a  ** doNotSync.**.
2720: 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61 62  **   This variab
2730: 6c 65 20 69 73 20 73 65 74 20 61 6e 64 20 63 6c  le is set and cl
2740: 65 61 72 65 64 20 62 79 20 73 71 6c 69 74 65 33  eared by sqlite3
2750: 50 61 67 65 72 57 72 69 74 65 28 29 2e 0a 2a 2a  PagerWrite()..**
2760: 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a 0a  .** needSync.**.
2770: 2a 2a 20 20 20 54 4f 44 4f 3a 20 49 74 20 6d 69  **   TODO: It mi
2780: 67 68 74 20 62 65 20 65 61 73 69 65 72 20 74 6f  ght be easier to
2790: 20 73 65 74 20 74 68 69 73 20 76 61 72 69 61 62   set this variab
27a0: 6c 65 20 69 6e 20 77 72 69 74 65 4a 6f 75 72 6e  le in writeJourn
27b0: 61 6c 48 64 72 28 29 0a 2a 2a 20 20 20 61 6e 64  alHdr().**   and
27c0: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
27d0: 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20 43 68 61 6e  nal() only. Chan
27e0: 67 65 20 69 74 73 20 6d 65 61 6e 69 6e 67 20 74  ge its meaning t
27f0: 6f 20 22 75 6e 73 79 6e 63 65 64 20 64 61 74 61  o "unsynced data
2800: 0a 2a 2a 20 20 20 68 61 73 20 62 65 65 6e 20 77  .**   has been w
2810: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
2820: 75 72 6e 61 6c 22 2e 0a 2a 2a 0a 2a 2a 20 73 75  urnal"..**.** su
2830: 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a  bjInMemory.**.**
2840: 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f 6f     This is a boo
2850: 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20 49  lean variable. I
2860: 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79  f true, then any
2870: 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a 6f   required sub-jo
2880: 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f 70  urnal.**   is op
2890: 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65  ened as an in-me
28a0: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  mory journal fil
28b0: 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68 65  e. If false, the
28c0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20  n in-memory.**  
28d0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61 72   sub-journals ar
28e0: 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20  e only used for 
28f0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20  in-memory pager 
2900: 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  files..*/.struct
2910: 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74   Pager {.  sqlit
2920: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
2930: 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e         /* OS fun
2940: 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f  ctions to use fo
2950: 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63  r IO */.  u8 exc
2960: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
2970: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
2980: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
2990: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
29a0: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
29b0: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
29c0: 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68 65 20     /* On of the 
29d0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
29e0: 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  E_* values */.  
29f0: 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20  u8 useJournal;  
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
2a10: 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  se a rollback jo
2a20: 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69  urnal on this fi
2a30: 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61  le */.  u8 noRea
2a40: 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  dlock;          
2a50: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f      /* Do not bo
2a60: 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72  ther to obtain r
2a70: 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38  eadlocks */.  u8
2a80: 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20   noSync;        
2a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
2aa0: 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  not sync the jou
2ab0: 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a  rnal if true */.
2ac0: 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20    u8 fullSync;  
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ae0: 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20   Do extra syncs 
2af0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
2b00: 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f  or robustness */
2b10: 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c 61 67 73  .  u8 sync_flags
2b20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2b30: 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e 4f  * One of SYNC_NO
2b40: 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c  RMAL or SYNC_FUL
2b50: 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69  L */.  u8 tempFi
2b60: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
2b70: 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
2b80: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
2b90: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64  ile */.  u8 read
2ba0: 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20  Only;           
2bb0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
2bc0: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
2bd0: 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d 65  abase */.  u8 me
2be0: 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  mDb;            
2bf0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
2c00: 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69  o inhibit all fi
2c10: 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a 20  le I/O */..  /* 
2c20: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
2c30: 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f  ock contains tho
2c40: 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73  se class members
2c50: 20 74 68 61 74 20 61 72 65 20 64 79 6e 61 6d 69   that are dynami
2c60: 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d 6f 64 69 66  cally.  ** modif
2c70: 69 65 64 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61  ied during norma
2c80: 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 54 68  l operations. Th
2c90: 65 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c 65  e other variable
2ca0: 73 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  s in this struct
2cb0: 75 72 65 0a 20 20 2a 2a 20 61 72 65 20 65 69 74  ure.  ** are eit
2cc0: 68 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 72  her constant thr
2cd0: 6f 75 67 68 6f 75 74 20 74 68 65 20 6c 69 66 65  oughout the life
2ce0: 74 69 6d 65 20 6f 66 20 74 68 65 20 70 61 67 65  time of the page
2cf0: 72 2c 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20  r, or else.  ** 
2d00: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 63 6f  used to store co
2d10: 6e 66 69 67 75 72 61 74 69 6f 6e 20 70 61 72 61  nfiguration para
2d20: 6d 65 74 65 72 73 20 74 68 61 74 20 61 66 66 65  meters that affe
2d30: 63 74 20 74 68 65 20 77 61 79 20 74 68 65 20 70  ct the way the p
2d40: 61 67 65 72 20 0a 20 20 2a 2a 20 6f 70 65 72 61  ager .  ** opera
2d50: 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  tes..  **.  ** T
2d60: 68 65 20 27 73 74 61 74 65 27 20 76 61 72 69 61  he 'state' varia
2d70: 62 6c 65 20 69 73 20 64 65 73 63 72 69 62 65 64  ble is described
2d80: 20 69 6e 20 6d 6f 72 65 20 64 65 74 61 69 6c 20   in more detail 
2d90: 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 0a 20  along with the. 
2da0: 20 2a 2a 20 64 65 73 63 72 69 70 74 69 6f 6e 73   ** descriptions
2db0: 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20 69   of the values i
2dc0: 74 20 6d 61 79 20 74 61 6b 65 20 2d 20 50 41 47  t may take - PAG
2dd0: 45 52 5f 55 4e 4c 4f 43 4b 20 65 74 63 2e 20 4d  ER_UNLOCK etc. M
2de0: 61 6e 79 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  any of the.  ** 
2df0: 6f 74 68 65 72 20 76 61 72 69 61 62 6c 65 73 20  other variables 
2e00: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
2e10: 65 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74  e described in t
2e20: 68 65 20 63 6f 6d 6d 65 6e 74 20 64 69 72 65 63  he comment direc
2e30: 74 6c 79 20 0a 20 20 2a 2a 20 61 62 6f 76 65 20  tly .  ** above 
2e40: 74 68 69 73 20 63 6c 61 73 73 20 64 65 66 69 6e  this class defin
2e50: 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 75 38  ition..  */.  u8
2e60: 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20   state;         
2e70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
2e80: 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52  ER_UNLOCK, _SHAR
2e90: 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20 65  ED, _RESERVED, e
2ea0: 74 63 2e 20 2a 2f 0a 20 20 75 38 20 64 62 4d 6f  tc. */.  u8 dbMo
2eb0: 64 69 66 69 65 64 3b 20 20 20 20 20 20 20 20 20  dified;         
2ec0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2ed0: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 63 68  there are any ch
2ee0: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 44 62 20  anges to the Db 
2ef0: 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63  */.  u8 needSync
2f00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f10: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66   /* True if an f
2f20: 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64  sync() is needed
2f30: 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
2f40: 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53  */.  u8 journalS
2f50: 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20 20  tarted;         
2f60: 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61 64   /* True if head
2f70: 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73  er of journal is
2f80: 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20   synced */.  u8 
2f90: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b  changeCountDone;
2fa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
2fb0: 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69  after incrementi
2fc0: 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  ng the change-co
2fd0: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65  unter */.  u8 se
2fe0: 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20  tMaster;        
2ff0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3000: 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73  f a m-j name has
3010: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
3020: 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f   jrnl */.  u8 do
3030: 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20 20  NotSync;        
3040: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
3050: 6e 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20 64  n. While true, d
3060: 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20  o not spill the 
3070: 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 64 62  cache */.  u8 db
3080: 53 69 7a 65 56 61 6c 69 64 3b 20 20 20 20 20 20  SizeValid;      
3090: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 77 68         /* Set wh
30a0: 65 6e 20 64 62 53 69 7a 65 20 69 73 20 63 6f 72  en dbSize is cor
30b0: 72 65 63 74 20 2a 2f 0a 20 20 75 38 20 73 75 62  rect */.  u8 sub
30c0: 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20 20  jInMemory;      
30d0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
30e0: 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   use in-memory s
30f0: 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20  ub-journals */. 
3100: 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20 20   Pgno dbSize;   
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3120: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
3130: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
3140: 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69 67  */.  Pgno dbOrig
3150: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
3160: 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72   /* dbSize befor
3170: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  e the current tr
3180: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 50  ansaction */.  P
3190: 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b 20  gno dbFileSize; 
31a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
31b0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
31c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31d0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43  le */.  int errC
31e0: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
31f0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65      /* One of se
3200: 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65  veral kinds of e
3210: 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  rrors */.  int n
3220: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
3230: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20         /* Pages 
3240: 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63 65  journalled since
3250: 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20 77   last j-header w
3260: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32 20  ritten */.  u32 
3270: 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20  cksumInit;      
3280: 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69          /* Quasi
3290: 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64  -random value ad
32a0: 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65  ded to every che
32b0: 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20 6e  cksum */.  u32 n
32c0: 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20 20  SubRec;         
32d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
32e0: 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69 74   of records writ
32f0: 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72 6e  ten to sub-journ
3300: 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  al */.  Bitvec *
3310: 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  pInJournal;     
3320: 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66      /* One bit f
3330: 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
3340: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
3350: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
3360: 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20 20  ile *fd;        
3370: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
3380: 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62 61  iptor for databa
3390: 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  se */.  sqlite3_
33a0: 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20  file *jfd;      
33b0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
33c0: 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e 20  riptor for main 
33d0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c  journal */.  sql
33e0: 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64 3b  ite3_file *sjfd;
33f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
3400: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
3410: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  sub-journal */. 
3420: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b   i64 journalOff;
3430: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3440: 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f 66  Current write of
3450: 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  fset in the jour
3460: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
3470: 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20  4 journalHdr;   
3480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
3490: 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76  e offset to prev
34a0: 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61  ious journal hea
34b0: 64 65 72 20 2a 2f 0a 20 20 50 61 67 65 72 53 61  der */.  PagerSa
34c0: 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70 6f  vepoint *aSavepo
34d0: 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f 66  int; /* Array of
34e0: 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
34f0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 76  ts */.  int nSav
3500: 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 20  epoint;         
3510: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3520: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53 61   elements in aSa
3530: 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20 63  vepoint[] */.  c
3540: 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31  har dbFileVers[1
3550: 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68  6];        /* Ch
3560: 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64  anges whenever d
3570: 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
3580: 6e 67 65 73 20 2a 2f 0a 20 20 75 33 32 20 73 65  nges */.  u32 se
3590: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
35a0: 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64        /* Assumed
35b0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72   sector size dur
35c0: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ing rollback */.
35d0: 0a 20 20 75 31 36 20 6e 45 78 74 72 61 3b 20 20  .  u16 nExtra;  
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35f0: 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20  * Add this many 
3600: 62 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e  bytes to each in
3610: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
3620: 20 20 69 31 36 20 6e 52 65 73 65 72 76 65 3b 20    i16 nReserve; 
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3640: 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65   Number of unuse
3650: 64 20 62 79 74 65 73 20 61 74 20 65 6e 64 20 6f  d bytes at end o
3660: 66 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  f each page */. 
3670: 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b 20 20   u32 vfsFlags;  
3680: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3690: 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65  Flags for sqlite
36a0: 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
36b0: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
36c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
36e0: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
36f0: 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20   Pgno mxPgno;   
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3710: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
3720: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
3730: 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  base */.  char *
3740: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
3750: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
3760: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3770: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
3780: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
3790: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
37a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
37b0: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  */.  int (*xBusy
37c0: 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b  Handler)(void*);
37d0: 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
37e0: 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a  call when busy *
37f0: 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
3800: 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20  andlerArg;      
3810: 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d  /* Context argum
3820: 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e  ent for xBusyHan
3830: 64 6c 65 72 20 2a 2f 0a 23 69 66 64 65 66 20 53  dler */.#ifdef S
3840: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
3850: 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20 20   nHit, nMiss;   
3860: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68           /* Cach
3870: 65 20 68 69 74 73 20 61 6e 64 20 6d 69 73 73 69  e hits and missi
3880: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61  ng */.  int nRea
3890: 64 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20  d, nWrite;      
38a0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
38b0: 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74 74  pages read/writt
38c0: 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76  en */.#endif.  v
38d0: 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29  oid (*xReiniter)
38e0: 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61  (DbPage*); /* Ca
38f0: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
3900: 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70  when reloading p
3910: 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53  ages */.#ifdef S
3920: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
3930: 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63    void *(*xCodec
3940: 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67  )(void*,void*,Pg
3950: 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74  no,int); /* Rout
3960: 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64  ine for en/decod
3970: 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  ing data */.  vo
3980: 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43  id (*xCodecSizeC
3990: 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69  hng)(void*,int,i
39a0: 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f  nt); /* Notify o
39b0: 66 20 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e  f page size chan
39c0: 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ges */.  void (*
39d0: 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64  xCodecFree)(void
39e0: 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *);             
39f0: 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f  /* Destructor fo
3a00: 72 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20  r the codec */. 
3a10: 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20   void *pCodec;  
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3a30: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
3a40: 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68  o xCodec... meth
3a50: 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ods */.#endif.  
3a60: 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b  char *pTmpSpace;
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3a80: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79  ager.pageSize by
3a90: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
3aa0: 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 69 36   tmp use */.  i6
3ab0: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  4 journalSizeLim
3ac0: 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  it;       /* Siz
3ad0: 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73  e limit for pers
3ae0: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  istent journal f
3af0: 69 6c 65 73 20 2a 2f 0a 20 20 50 43 61 63 68 65  iles */.  PCache
3b00: 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20   *pPCache;      
3b10: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
3b20: 20 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f   to page cache o
3b30: 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
3b40: 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b  e3_backup *pBack
3b50: 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  up;    /* Pointe
3b60: 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67  r to list of ong
3b70: 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63  oing backup proc
3b80: 65 73 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  esses */.};../*.
3b90: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
3ba0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
3bb0: 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20  s hold counters 
3bc0: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
3bd0: 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c  ing purposes onl
3be0: 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  y.  These variab
3bf0: 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  les do not exist
3c00: 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73   in.** a non-tes
3c10: 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65  ting build.  The
3c20: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
3c30: 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65   not thread-safe
3c40: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
3c50: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
3c60: 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
3c70: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
3c80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
3c90: 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d   pages read from
3ca0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
3cb0: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
3cc0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a  _count = 0;   /*
3cd0: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
3ce0: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
3cf0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
3d00: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
3d10: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
3d20: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
3d30: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
3d40: 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  nal */.# define 
3d50: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76  PAGER_INCR(v)  v
3d60: 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ++.#else.# defin
3d70: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a  e PAGER_INCR(v).
3d80: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
3d90: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
3da0: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
3db0: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
3dc0: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
3dd0: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
3de0: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
3df0: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
3e00: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
3e10: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
3e20: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
3e30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
3e40: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
3e50: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
3e60: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
3e70: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
3e80: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
3e90: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
3ea0: 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e  being.** written
3eb0: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
3ec0: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
3ed0: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
3ee0: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
3ef0: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
3f00: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
3f10: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
3f20: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
3f30: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
3f40: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
3f50: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
3f60: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
3f70: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
3f80: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
3f90: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
3fa0: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
3fb0: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
3fc0: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
3fd0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
3fe0: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
3ff0: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
4000: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
4010: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
4020: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
4030: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
4040: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
4050: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
4060: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
4070: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
4080: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
4090: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
40a0: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
40b0: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
40c0: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
40d0: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
40e0: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
40f0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
4100: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
4110: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
4120: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
4130: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
4140: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
4150: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
4160: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
4170: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
4180: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
4190: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
41a0: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
41b0: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
41c0: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
41d0: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
41e0: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
41f0: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
4200: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
4210: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
4220: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
4230: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
4240: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
4250: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
4260: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
4270: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
4280: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
4290: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
42a0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
42b0: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
42c0: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
42d0: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
42e0: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
42f0: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
4300: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
4310: 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63  ze of the of eac
4320: 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e  h page record in
4330: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
4340: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20  given by.** the 
4350: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e  following macro.
4360: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
4370: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
4380: 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67  )  ((pPager->pag
4390: 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a  eSize) + 8)../*.
43a0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** The journal h
43b0: 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74  eader size for t
43c0: 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20  his pager. This 
43d0: 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73  is usually the s
43e0: 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20  ame .** size as 
43f0: 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
4400: 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73  ctor. See also s
4410: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a  etSectorSize()..
4420: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
4430: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
4440: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
4450: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
4460: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
4470: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
4480: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
4490: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
44a0: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
44b0: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
44c0: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
44d0: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
44e0: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
44f0: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
4500: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
4510: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
4520: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
4530: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
4540: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
4550: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
4560: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
4570: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
4580: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
4590: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
45a0: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
45b0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
45c0: 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20  e maximum legal 
45d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28  page number is (
45e0: 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64  2^31 - 1)..*/.#d
45f0: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f  efine PAGER_MAX_
4600: 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a  PGNO 2147483647.
4610: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
4620: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a  ./*.** Usage:.**
4630: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73  .**   assert( as
4640: 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
4650: 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2f 0a 73  (pPager) );.*/.s
4660: 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74  tatic int assert
4670: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67  _pager_state(Pag
4680: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20  er *pPager){..  
4690: 2f 2a 20 41 20 74 65 6d 70 2d 66 69 6c 65 20 69  /* A temp-file i
46a0: 73 20 61 6c 77 61 79 73 20 69 6e 20 50 41 47 45  s always in PAGE
46b0: 52 5f 45 58 43 4c 55 53 49 56 45 20 6f 72 20 50  R_EXCLUSIVE or P
46c0: 41 47 45 52 5f 53 59 4e 43 45 44 20 73 74 61 74  AGER_SYNCED stat
46d0: 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
46e0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
46f0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ==0 || pPager->s
4700: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
4710: 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 54  USIVE );..  /* T
4720: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
4730: 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79  ne flag is alway
4740: 73 20 73 65 74 20 66 6f 72 20 74 65 6d 70 2d 66  s set for temp-f
4750: 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  iles */.  assert
4760: 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
4770: 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  le==0 || pPager-
4780: 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
4790: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b   );..  return 1;
47a0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
47b0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
47c0: 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
47d0: 74 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70  to write page *p
47e0: 50 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  Pg into the sub-
47f0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61  journal..** A pa
4800: 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77  ge needs to be w
4810: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
4820: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74  sub-journal if t
4830: 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a  here exists one.
4840: 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20  ** or more open 
4850: 73 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77  savepoints for w
4860: 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  hich:.**.**   * 
4870: 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  The page-number 
4880: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
4890: 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61  equal to PagerSa
48a0: 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61  vepoint.nOrig, a
48b0: 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69  nd.**   * The bi
48c0: 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
48d0: 74 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  to the page-numb
48e0: 65 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e  er is not set in
48f0: 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
4900: 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
4910: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
4920: 6e 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  nt subjRequiresP
4930: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
4940: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
4950: 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  Pg->pgno;.  Page
4960: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
4970: 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69  >pPager;.  int i
4980: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
4990: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
49a0: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67  t; i++){.    Pag
49b0: 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d  erSavepoint *p =
49c0: 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
49d0: 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28  oint[i];.    if(
49e0: 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20   p->nOrig>=pgno 
49f0: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74  && 0==sqlite3Bit
4a00: 76 65 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61  vecTest(p->pInSa
4a10: 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29  vepoint, pgno) )
4a20: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
4a30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
4a40: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
4a50: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
4a60: 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65  the page is alre
4a70: 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
4a80: 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  al file..*/.stat
4a90: 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75  ic int pageInJou
4aa0: 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29  rnal(PgHdr *pPg)
4ab0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
4ac0: 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 67  e3BitvecTest(pPg
4ad0: 2d 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ->pPager->pInJou
4ae0: 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
4af0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
4b00: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
4b10: 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20   from the given 
4b20: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
4b30: 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65    Store the inte
4b40: 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72  ger.** that is r
4b50: 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52  ead in *pRes.  R
4b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
4b70: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
4b80: 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65  rked, or an.** e
4b90: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
4ba0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
4bb0: 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c  g..**.** All val
4bc0: 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f  ues are stored o
4bd0: 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e  n disk as big-en
4be0: 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dian..*/.static 
4bf0: 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73  int read32bits(s
4c00: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
4c10: 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32   i64 offset, u32
4c20: 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67   *pRes){.  unsig
4c30: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
4c40: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
4c50: 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c  e3OsRead(fd, ac,
4c60: 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66   sizeof(ac), off
4c70: 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  set);.  if( rc==
4c80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4c90: 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33   *pRes = sqlite3
4ca0: 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20  Get4byte(ac);.  
4cb0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4cc0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
4cd0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
4ce0: 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66  nto a string buf
4cf0: 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  fer in big-endia
4d00: 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f  n byte order..*/
4d10: 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69  .#define put32bi
4d20: 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33  ts(A,B)  sqlite3
4d30: 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c  Put4byte((u8*)A,
4d40: 42 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  B)../*.** Write 
4d50: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
4d60: 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20   into the given 
4d70: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
4d80: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
4d90: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
4da0: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
4db0: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
4dc0: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
4dd0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
4de0: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
4df0: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
4e00: 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63  t, u32 val){.  c
4e10: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74  har ac[4];.  put
4e20: 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b  32bits(ac, val);
4e30: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
4e40: 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c  3OsWrite(fd, ac,
4e50: 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a   4, offset);.}..
4e60: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
4e70: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
4e80: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
4e90: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
4ea0: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
4eb0: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
4ec0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
4ed0: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
4ee0: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
4ef0: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
4f00: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
4f10: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
4f20: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
4f30: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
4f40: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
4f50: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
4f60: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
4f70: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
4f80: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
4f90: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
4fa0: 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a  ->pMethods)../*.
4fb0: 2a 2a 20 49 66 20 66 69 6c 65 20 70 46 64 20 69  ** If file pFd i
4fc0: 73 20 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c  s open, call sql
4fd0: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f  ite3OsUnlock() o
4fe0: 6e 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  n it..*/.static 
4ff0: 69 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c  int osUnlock(sql
5000: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20  ite3_file *pFd, 
5010: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66  int eLock){.  if
5020: 28 20 21 69 73 4f 70 65 6e 28 70 46 64 29 20 29  ( !isOpen(pFd) )
5030: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
5040: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
5050: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e  turn sqlite3OsUn
5060: 6c 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29  lock(pFd, eLock)
5070: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
5080: 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69  function determi
5090: 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e  nes whether or n
50a0: 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ot the atomic-wr
50b0: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
50c0: 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20  .** can be used 
50d0: 77 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e  with this pager.
50e0: 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   The optimizatio
50f0: 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66  n can be used if
5100: 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65  :.**.**  (a) the
5110: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
5120: 62 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61  by OsDeviceChara
5130: 63 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64  cteristics() ind
5140: 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20  icates that.**  
5150: 20 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70      a database p
5160: 61 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74  age may be writt
5170: 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61  en atomically, a
5180: 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76  nd.**  (b) the v
5190: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
51a0: 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20   OsSectorSize() 
51b0: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
51c0: 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f  equal.**      to
51d0: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a   the page size..
51e0: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69  **.** The optimi
51f0: 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61  zation is also a
5200: 6c 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f  lways enabled fo
5210: 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
5220: 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65  s. It is.** an e
5230: 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69  rror to call thi
5240: 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50  s function if pP
5250: 61 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f  ager is opened o
5260: 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  n an in-memory.*
5270: 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  * database..**.*
5280: 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  * If the optimiz
5290: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ation cannot be 
52a0: 75 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72  used, 0 is retur
52b0: 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62  ned. If it can b
52c0: 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  e used,.** then 
52d0: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
52e0: 65 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ed is the size o
52f0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
5300: 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f  le when it.** co
5310: 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20  ntains rollback 
5320: 64 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79  data for exactly
5330: 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   one page..*/.#i
5340: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
5350: 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
5360: 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42  static int jrnlB
5370: 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20  ufferSize(Pager 
5380: 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65  *pPager){.  asse
5390: 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
53a0: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
53b0: 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  pFile ){.    int
53c0: 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   dc;            
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
53e0: 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74  * Device charact
53f0: 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20  eristics */.    
5400: 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20  int nSector;    
5410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5420: 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65    /* Sector size
5430: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61   */.    int szPa
5440: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
5450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
5460: 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61  e size */..    a
5470: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
5480: 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20  ager->fd) );.   
5490: 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   dc = sqlite3OsD
54a0: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
54b0: 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
54c0: 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20  ;.    nSector = 
54d0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
54e0: 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d  ze;.    szPage =
54f0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
5500: 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53  e;..    assert(S
5510: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
5520: 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
5530: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c  ;.    assert(SQL
5540: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
5550: 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29  64K==(65536>>8))
5560: 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63  ;.    if( 0==(dc
5570: 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
5580: 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38  TOMIC|(szPage>>8
5590: 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a  )) || nSector>sz
55a0: 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72  Page) ){.      r
55b0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
55c0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55   }..  return JOU
55d0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
55e0: 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47  er) + JOURNAL_PG
55f0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23  _SZ(pPager);.}.#
5600: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
5610: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
5620: 45 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68  ES is defined th
5630: 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61  en we do some sa
5640: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  nity checking.**
5650: 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73   on the cache us
5660: 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74  ing a hash funct
5670: 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73  ion.  This is us
5680: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a  ed for testing.*
5690: 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  * and debugging 
56a0: 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  only..*/.#ifdef 
56b0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
56c0: 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ES./*.** Return 
56d0: 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66  a 32-bit hash of
56e0: 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66   the page data f
56f0: 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  or pPage..*/.sta
5700: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61  tic u32 pager_da
5710: 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65  tahash(int nByte
5720: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
5730: 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68  *pData){.  u32 h
5740: 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ash = 0;.  int i
5750: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
5760: 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Byte; i++){.    
5770: 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33  hash = (hash*103
5780: 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20  9) + pData[i];. 
5790: 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68   }.  return hash
57a0: 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70  ;.}.static u32 p
57b0: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67  ager_pagehash(Pg
57c0: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72  Hdr *pPage){.  r
57d0: 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61  eturn pager_data
57e0: 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67  hash(pPage->pPag
57f0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75  er->pageSize, (u
5800: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
5810: 50 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a  Page->pData);.}.
5820: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
5830: 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50  r_set_pagehash(P
5840: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
5850: 70 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20  pPage->pageHash 
5860: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
5870: 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pPage);.}../*.*
5880: 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45  * The CHECK_PAGE
5890: 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50   macro takes a P
58a0: 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75  gHdr* as an argu
58b0: 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f  ment. If SQLITE_
58c0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69  CHECK_PAGES.** i
58d0: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e  s defined, and N
58e0: 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66  DEBUG is not def
58f0: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
5900: 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63  ) statement chec
5910: 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70  ks.** that the p
5920: 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69  age is either di
5930: 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74  rty or still mat
5940: 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61  ches the calcula
5950: 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a  ted page-hash..*
5960: 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  /.#define CHECK_
5970: 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67  PAGE(x) checkPag
5980: 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64  e(x).static void
5990: 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72   checkPage(PgHdr
59a0: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
59b0: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
59c0: 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28  Pager;.  assert(
59d0: 20 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20   !pPg->pageHash 
59e0: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
59f0: 64 65 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67  de.      || (pPg
5a00: 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
5a10: 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67  RTY) || pPg->pag
5a20: 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67  eHash==pager_pag
5a30: 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a  ehash(pPg) );.}.
5a40: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70  .#else.#define p
5a50: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c  ager_datahash(X,
5a60: 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61  Y)  0.#define pa
5a70: 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20  ger_pagehash(X) 
5a80: 20 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b   0.#define CHECK
5a90: 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20  _PAGE(x).#endif 
5aa0: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   /* SQLITE_CHECK
5ab0: 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _PAGES */../*.**
5ac0: 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
5ad0: 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lled the journal
5ae0: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
5af0: 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f  pPager must be o
5b00: 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e  pen..** This fun
5b10: 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
5b20: 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20  o read a master 
5b30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
5b40: 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65  e from the .** e
5b50: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61  nd of the file a
5b60: 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75  nd, if successfu
5b70: 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74  l, copies it int
5b80: 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65  o memory supplie
5b90: 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  d .** by the cal
5ba0: 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ler. See comment
5bb0: 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73  s above writeMas
5bc0: 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72  terJournal() for
5bd0: 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75   the format.** u
5be0: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d  sed to store a m
5bf0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
5c00: 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65  le name at the e
5c10: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
5c20: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73  file..**.** zMas
5c30: 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ter must point t
5c40: 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74  o a buffer of at
5c50: 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62   least nMaster b
5c60: 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ytes allocated b
5c70: 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e  y.** the caller.
5c80: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
5c90: 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
5ca0: 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73  thname+1 (to ens
5cb0: 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  ure there is.** 
5cc0: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20  enough space to 
5cd0: 77 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  write the master
5ce0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20   journal name). 
5cf0: 49 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  If the master jo
5d00: 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e  urnal.** name in
5d10: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
5d20: 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73  longer than nMas
5d30: 74 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75  ter bytes (inclu
5d40: 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65  ding a.** nul-te
5d50: 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20  rminator), then 
5d60: 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20  this is handled 
5d70: 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20  as if no master 
5d80: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20  journal name.** 
5d90: 77 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20  were present in 
5da0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
5db0: 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
5dc0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
5dd0: 20 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74   is present at t
5de0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
5df0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74  urnal.** file, t
5e00: 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64  hen it is copied
5e10: 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72   into the buffer
5e20: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
5e30: 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c  Master. A.** nul
5e40: 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
5e50: 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20   is appended to 
5e60: 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f  the buffer follo
5e70: 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a  wing the master.
5e80: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
5e90: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  name..**.** If i
5ea0: 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  t is determined 
5eb0: 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a  that no master j
5ec0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
5ed0: 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20   is present .** 
5ee0: 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65  zMaster[0] is se
5ef0: 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
5f00: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
5f10: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
5f20: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65   occurs while re
5f30: 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a  ading from the j
5f40: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20  ournal file, an 
5f50: 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20  SQLite.** error 
5f60: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
5f70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5f80: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
5f90: 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
5fa0: 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61  pJrnl, char *zMa
5fb0: 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65  ster, u32 nMaste
5fc0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
5fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fe0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
5ff0: 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20  */.  u32 len;   
6000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6010: 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74  /* Length in byt
6020: 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  es of master jou
6030: 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  rnal name */.  i
6040: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
6050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
6060: 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  al size in bytes
6070: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   of journal file
6080: 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20   pJrnl */.  u32 
6090: 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
60a0: 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65         /* MJ che
60b0: 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64  cksum value read
60c0: 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f   from journal */
60d0: 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20  .  u32 u;       
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
60f0: 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
6100: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69  ounter */.  unsi
6110: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
6120: 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66  [8];   /* A buff
6130: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
6140: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
6150: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c   zMaster[0] = '\
6160: 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54  0';..  if( SQLIT
6170: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
6180: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a  te3OsFileSize(pJ
6190: 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c  rnl, &szJ)).   |
61a0: 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53  | szJ<16.   || S
61b0: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
61c0: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
61d0: 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29  , szJ-16, &len))
61e0: 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73  .   || len>=nMas
61f0: 74 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54  ter .   || SQLIT
6200: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
6210: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a  32bits(pJrnl, sz
6220: 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20  J-12, &cksum)). 
6230: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
6240: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52  (rc = sqlite3OsR
6250: 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69  ead(pJrnl, aMagi
6260: 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20  c, 8, szJ-8)).  
6270: 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69   || memcmp(aMagi
6280: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
6290: 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  , 8).   || SQLIT
62a0: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
62b0: 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c  te3OsRead(pJrnl,
62c0: 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73   zMaster, len, s
62d0: 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b  zJ-16-len)).  ){
62e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
62f0: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66    }..  /* See if
6300: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61   the checksum ma
6310: 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72  tches the master
6320: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f   journal name */
6330: 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65  .  for(u=0; u<le
6340: 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  n; u++){.    cks
6350: 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d  um -= zMaster[u]
6360: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75  ;.  }.  if( cksu
6370: 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  m ){.    /* If t
6380: 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73  he checksum does
6390: 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e  n't add up, then
63a0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
63b0: 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73  the disk sectors
63c0: 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  .    ** containi
63d0: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
63e0: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
63f0: 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69  s corrupted. Thi
6400: 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64  s means.    ** d
6410: 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62  efinitely roll b
6420: 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74  ack, so just ret
6430: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  urn SQLITE_OK an
6440: 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29  d report a (nul)
6450: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a  .    ** master-j
6460: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  ournal filename.
6470: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20  .    */.    len 
6480: 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  = 0;.  }.  zMast
6490: 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a  er[len] = '\0';.
64a0: 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c     .  return SQL
64b0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
64c0: 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73   Return the offs
64d0: 65 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  et of the sector
64e0: 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20   boundary at or 
64f0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20  immediately .** 
6500: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61  following the va
6510: 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a  lue in pPager->j
6520: 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d  ournalOff, assum
6530: 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a  ing a sector .**
6540: 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d   size of pPager-
6550: 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65  >sectorSize byte
6560: 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72  s..**.** i.e for
6570: 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f   a sector size o
6580: 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50  f 512:.**.**   P
6590: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
65a0: 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20           Return 
65b0: 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  value.**   -----
65c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65e0: 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20  --.**   0       
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6600: 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20    0.**   512    
6610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6620: 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20     512.**   100 
6630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6640: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32        512.**   2
6650: 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  000             
6660: 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a           2048.**
6670: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20   .*/.static i64 
6680: 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
6690: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
66a0: 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20  .  i64 offset = 
66b0: 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61  0;.  i64 c = pPa
66c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
66d0: 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20  .  if( c ){.    
66e0: 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f  offset = ((c-1)/
66f0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
6700: 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f  Pager) + 1) * JO
6710: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
6720: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ger);.  }.  asse
6730: 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e  rt( offset%JOURN
6740: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
6750: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
6760: 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20  ( offset>=c );. 
6770: 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74   assert( (offset
6780: 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -c)<JOURNAL_HDR_
6790: 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
67a0: 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d  return offset;.}
67b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
67c0: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
67d0: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
67e0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
67f0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ed..**.** This f
6800: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
6810: 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  op if the journa
6820: 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62  l file has not b
6830: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a  een written to.*
6840: 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72  * within the cur
6850: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
6860: 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e   (i.e. if Pager.
6870: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a  journalOff==0)..
6880: 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63  **.** If doTrunc
6890: 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  ate is non-zero 
68a0: 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75  or the Pager.jou
68b0: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61  rnalSizeLimit va
68c0: 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74  riable is.** set
68d0: 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e   to 0, then trun
68e0: 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  cate the journal
68f0: 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79   file to zero by
6900: 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68  tes in size. Oth
6910: 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20  erwise,.** zero 
6920: 74 68 65 20 32 38 2d 62 79 74 65 20 68 65 61 64  the 28-byte head
6930: 65 72 20 61 74 20 74 68 65 20 73 74 61 72 74 20  er at the start 
6940: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
6950: 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63  ile. In either c
6960: 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20  ase, .** if the 
6970: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
6980: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79  no-sync mode, sy
6990: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
69a0: 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ile immediately 
69b0: 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e  .** after writin
69c0: 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
69d0: 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67  it..**.** If Pag
69e0: 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  er.journalSizeLi
69f0: 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20 61 20  mit is set to a 
6a00: 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65  positive, non-ze
6a10: 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a  ro value, and.**
6a20: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74   following the t
6a30: 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72  runcation or zer
6a40: 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64 20 61  oing described a
6a50: 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66  bove the size of
6a60: 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c   the .** journal
6a70: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69   file in bytes i
6a80: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
6a90: 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  is value, then t
6aa0: 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a  runcate the.** j
6ab0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50  ournal file to P
6ac0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
6ad0: 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65  Limit bytes. The
6ae0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
6af0: 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74  es.** not need t
6b00: 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c  o be synced foll
6b10: 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61  owing this opera
6b20: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tion..**.** If a
6b30: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
6b40: 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65  s, abandon proce
6b50: 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  ssing and return
6b60: 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
6b70: 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  de..** Otherwise
6b80: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
6b90: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
6ba0: 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  t zeroJournalHdr
6bb0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
6bc0: 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b  int doTruncate){
6bd0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
6be0: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c00: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
6c10: 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ode */.  assert(
6c20: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
6c30: 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50  jfd) );.  if( pP
6c40: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6c50: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36   ){.    const i6
6c60: 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65  4 iLimit = pPage
6c70: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
6c80: 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  mit;    /* Local
6c90: 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f   cache of jsl */
6ca0: 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  ..    IOTRACE(("
6cb0: 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20  JZEROHDR %p\n", 
6cc0: 70 50 61 67 65 72 29 29 0a 20 20 20 20 69 66 28  pPager)).    if(
6cd0: 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69   doTruncate || i
6ce0: 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Limit==0 ){.    
6cf0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6d00: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
6d10: 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65  >jfd, 0);.    }e
6d20: 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69  lse{.      stati
6d30: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72  c const char zer
6d40: 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a  oHdr[28] = {0};.
6d50: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6d60: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
6d70: 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20  ->jfd, zeroHdr, 
6d80: 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c  sizeof(zeroHdr),
6d90: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
6da0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6db0: 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
6dc0: 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
6dd0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
6de0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
6df0: 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
6e00: 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  Y|pPager->sync_f
6e10: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  lags);.    }..  
6e20: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
6e30: 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nt the transacti
6e40: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20  on is committed 
6e50: 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f  but the write lo
6e60: 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74  ck .    ** is st
6e70: 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ill held on the 
6e80: 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
6e90: 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63  s a size limit c
6ea0: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20  onfigured for . 
6eb0: 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73     ** the persis
6ec0: 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  tent journal and
6ed0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6ee0: 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73  e currently cons
6ef0: 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a  umes more.    **
6f00: 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74   space than that
6f10: 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f   limit allows fo
6f20: 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e  r, truncate it n
6f30: 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  ow. There is no 
6f40: 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73  need.    ** to s
6f50: 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c  ync the file fol
6f60: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
6f70: 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
6f80: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6f90: 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20  _OK && iLimit>0 
6fa0: 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b  ){.      i64 sz;
6fb0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
6fc0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
6fd0: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b  ager->jfd, &sz);
6fe0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
6ff0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69  QLITE_OK && sz>i
7000: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
7010: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
7020: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
7030: 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  jfd, iLimit);.  
7040: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7050: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7060: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
7070: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
7080: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f  pen when this ro
7090: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
70a0: 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65   A journal.** he
70b0: 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  ader (JOURNAL_HD
70c0: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77  R_SZ bytes) is w
70d0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
70e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20  journal file at 
70f0: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c  the.** current l
7100: 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ocation..**.** T
7110: 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68  he format for th
7120: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
7130: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
7140: 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61  ** - 8 bytes: Ma
7150: 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20  gic identifying 
7160: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a  journal format..
7170: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75  ** - 4 bytes: Nu
7180: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
7190: 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d  in journal, or -
71a0: 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69  1 no-sync mode i
71b0: 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  s on..** - 4 byt
71c0: 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65  es: Random numbe
71d0: 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20  r used for page 
71e0: 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  hash..** - 4 byt
71f0: 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61  es: Initial data
7200: 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e  base page count.
7210: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53  .** - 4 bytes: S
7220: 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20  ector size used 
7230: 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  by the process t
7240: 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a  hat wrote this j
7250: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62  ournal..** - 4 b
7260: 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70  ytes: Database p
7270: 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a  age size..** .**
7280: 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f   Followed by (JO
7290: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
72a0: 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73  8) bytes of unus
72b0: 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  ed space..*/.sta
72c0: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75  tic int writeJou
72d0: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
72e0: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
72f0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
7300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7310: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
7320: 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20    char *zHeader 
7330: 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
7340: 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61  ace;  /* Tempora
7350: 72 79 20 73 70 61 63 65 20 75 73 65 64 20 74 6f  ry space used to
7360: 20 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f   build header */
7370: 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d  .  u32 nHeader =
7380: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
7390: 65 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  e;     /* Size o
73a0: 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  f buffer pointed
73b0: 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a   to by zHeader *
73c0: 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20  /.  u32 nWrite; 
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73e0: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
73f0: 20 6f 66 20 68 65 61 64 65 72 20 73 65 63 74 6f   of header secto
7400: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69  r written */.  i
7410: 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
7420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7430: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
7440: 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
7450: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
7460: 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20  jfd) );      /* 
7470: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  Journal file mus
7480: 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20  t be open. */.. 
7490: 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55   if( nHeader>JOU
74a0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
74b0: 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  er) ){.    nHead
74c0: 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  er = JOURNAL_HDR
74d0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
74e0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
74f0: 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70  are active savep
7500: 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66  oints and any of
7510: 20 74 68 65 6d 20 77 65 72 65 20 63 72 65 61 74   them were creat
7520: 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74  ed .  ** since t
7530: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a  he most recent j
7540: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61  ournal header wa
7550: 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74  s written, updat
7560: 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65  e the .  ** Page
7570: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
7580: 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77  ffset fields now
7590: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
75a0: 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
75b0: 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
75c0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
75d0: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
75e0: 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b  iHdrOffset==0 ){
75f0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
7600: 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48  Savepoint[ii].iH
7610: 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  drOffset = pPage
7620: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
7630: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
7640: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
7650: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7660: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
7670: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
7680: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74  .  /* .  ** Writ
7690: 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64  e the nRec Field
76a0: 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66   - the number of
76b0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68   page records th
76c0: 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20  at follow this. 
76d0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
76e0: 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65  er. Normally, ze
76f0: 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ro is written to
7700: 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74   this value at t
7710: 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41  his time..  ** A
7720: 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73  fter the records
7730: 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68   are added to th
7740: 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74  e journal (and t
7750: 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65  he journal synce
7760: 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66  d, .  ** if in f
7770: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20  ull-sync mode), 
7780: 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72  the zero is over
7790: 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65  written with the
77a0: 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a   true number.  *
77b0: 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65  * of records (se
77c0: 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29  e syncJournal())
77d0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61  ..  **.  ** A fa
77e0: 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65  ster alternative
77f0: 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46   is to write 0xF
7800: 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e  FFFFFFF to the n
7810: 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a  Rec field. When.
7820: 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65    ** reading the
7830: 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61   journal this va
7840: 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65  lue tells SQLite
7850: 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20   to assume that 
7860: 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66  the.  ** rest of
7870: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7880: 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64  e contains valid
7890: 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54   page records. T
78a0: 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20  his assumption. 
78b0: 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73   ** is dangerous
78c0: 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72  , as if a failur
78d0: 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73  e occurred whils
78e0: 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  t writing to the
78f0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
7900: 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69  le it may contai
7910: 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64  n some garbage d
7920: 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74  ata. There are t
7930: 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a  wo scenarios.  *
7940: 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73  * where this ris
7950: 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  k can be ignored
7960: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  :.  **.  **   * 
7970: 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69  When the pager i
7980: 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  s in no-sync mod
7990: 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61  e. Corruption ca
79a0: 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20  n follow a.  ** 
79b0: 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72      power failur
79c0: 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61  e in this case a
79d0: 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nyway..  **.  **
79e0: 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51     * When the SQ
79f0: 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
7a00: 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73  APPEND flag is s
7a10: 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74  et. This guarant
7a20: 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61  ees.  **     tha
7a30: 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69  t garbage data i
7a40: 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64  s never appended
7a50: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
7a60: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  file..  */.  ass
7a70: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
7a80: 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
7a90: 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69  r->noSync );.  i
7aa0: 66 28 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( (pPager->noSy
7ab0: 6e 63 29 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e  nc) || (pPager->
7ac0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
7ad0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
7ae0: 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71  EMORY).   || (sq
7af0: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
7b00: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
7b10: 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f  ger->fd)&SQLITE_
7b20: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
7b30: 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d  D) .  ){.    mem
7b40: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
7b50: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
7b60: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
7b70: 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74  ));.    put32bit
7b80: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
7b90: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
7ba0: 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a  ], 0xffffffff);.
7bb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 48 65    }else{.    zHe
7bc0: 61 64 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ader[0] = '\0';.
7bd0: 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
7be0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
7bf0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30  ournalMagic)], 0
7c00: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
7c10: 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61   random check-ha
7c20: 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a  sh initialiser *
7c30: 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  / .  sqlite3_ran
7c40: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70  domness(sizeof(p
7c50: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
7c60: 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  ), &pPager->cksu
7c70: 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62  mInit);.  put32b
7c80: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
7c90: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
7ca0: 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63  c)+4], pPager->c
7cb0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20  ksumInit);.  /* 
7cc0: 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61  The initial data
7cd0: 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  base size */.  p
7ce0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
7cf0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
7d00: 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67  lMagic)+8], pPag
7d10: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b  er->dbOrigSize);
7d20: 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65  .  /* The assume
7d30: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f  d sector size fo
7d40: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a  r this process *
7d50: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
7d60: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
7d70: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d  ournalMagic)+12]
7d80: 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  , pPager->sector
7d90: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  Size);..  /* The
7da0: 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
7db0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
7dc0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
7dd0: 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50  alMagic)+16], pP
7de0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
7df0: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
7e00: 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20  ing the tail of 
7e10: 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f  the buffer is no
7e20: 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76  t necessary.  Ev
7e30: 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f  erything.  ** wo
7e40: 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65 20  rks find if the 
7e50: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74  following memset
7e60: 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20  () is omitted.  
7e70: 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  But initializing
7e80: 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79  .  ** the memory
7e90: 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69   prevents valgri
7ea0: 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e  nd from complain
7eb0: 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77  ing, so we are w
7ec0: 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74  illing to.  ** t
7ed0: 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ake the performa
7ee0: 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20  nce hit..  */.  
7ef0: 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b  memset(&zHeader[
7f00: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
7f10: 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20  agic)+20], 0,.  
7f20: 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28         nHeader-(
7f30: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
7f40: 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f  agic)+20));..  /
7f50: 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74 20  * In theory, it 
7f60: 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72  is only necessar
7f70: 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 32  y to write the 2
7f80: 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68 65  8 bytes that the
7f90: 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68   .  ** journal h
7fa0: 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20 74  eader consumes t
7fb0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
7fc0: 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69 6e  le here. Then in
7fd0: 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a  crement the .  *
7fe0: 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  * Pager.journalO
7ff0: 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20 4a  ff variable by J
8000: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f  OURNAL_HDR_SZ so
8010: 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 0a   that the next .
8020: 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 77    ** record is w
8030: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 6f  ritten to the fo
8040: 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20 28  llowing sector (
8050: 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69 6e  leaving a gap in
8060: 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74   the file.  ** t
8070: 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c  hat will be impl
8080: 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e  icitly filled in
8090: 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a   by the OS)..  *
80a0: 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 69  *.  ** However i
80b0: 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63 6f  t has been disco
80c0: 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73 6f  vered that on so
80d0: 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73 20  me systems this 
80e0: 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a  pattern can .  *
80f0: 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e 74  * be significant
8100: 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20 63  ly slower than c
8110: 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69 74  ontiguously writ
8120: 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20  ing data to the 
8130: 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20  file,.  ** even 
8140: 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65 78  if that means ex
8150: 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e 67  plicitly writing
8160: 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c 6f   data to the blo
8170: 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55  ck of .  ** (JOU
8180: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
8190: 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69 6c  ) bytes that wil
81a0: 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 53  l not be used. S
81b0: 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a 20  o that is what. 
81c0: 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20   ** is done. .  
81d0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70  **.  ** The loop
81e0: 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65 72   is required her
81f0: 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 65  e in case the se
8200: 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72  ctor-size is lar
8210: 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20  ger than the .  
8220: 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ** database page
8230: 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68 65   size. Since the
8240: 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72 20   zHeader buffer 
8250: 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61  is only Pager.pa
8260: 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65  geSize.  ** byte
8270: 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20  s in size, more 
8280: 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f  than one call to
8290: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
82a0: 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72 65  ) may be require
82b0: 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61  d.  ** to popula
82c0: 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  te the entire jo
82d0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63  urnal header sec
82e0: 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72  tor..  */ .  for
82f0: 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53  (nWrite=0; rc==S
8300: 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65  QLITE_OK&&nWrite
8310: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
8320: 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b  pPager); nWrite+
8330: 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20 49  =nHeader){.    I
8340: 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
8350: 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
8360: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
8370: 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72  rnalHdr, nHeader
8380: 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
8390: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
83a0: 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
83b0: 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65 72   nHeader, pPager
83c0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
83d0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
83e0: 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72  alOff += nHeader
83f0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
8400: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
8410: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
8420: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
8430: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20  this is called. 
8440: 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  A journal header
8450: 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41   file.** (JOURNA
8460: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
8470: 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  is read from the
8480: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
8490: 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n in the journal
84a0: 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75  .** file. The cu
84b0: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69  rrent location i
84c0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
84d0: 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a  le is given by.*
84e0: 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  * pPager->journa
84f0: 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  lOff. See commen
8500: 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f  ts above functio
8510: 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  n writeJournalHd
8520: 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73  r() for.** a des
8530: 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
8540: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
8550: 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormat..**.** If 
8560: 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65  the header is re
8570: 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ad successfully,
8580: 20 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20 74   *pNRec is set t
8590: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
85a0: 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  ** page records 
85b0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68  following this h
85c0: 65 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69  eader and *pDbSi
85d0: 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
85e0: 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
85f0: 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
8600: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
8610: 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e  began, in pages.
8620: 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63   Also, pPager->c
8630: 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73  ksumInit.** is s
8640: 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
8650: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
8660: 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51  urnal header. SQ
8670: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
8680: 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ned.** in this c
8690: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
86a0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
86b0: 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f   file appears to
86c0: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53   be corrupted, S
86d0: 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a  QLITE_DONE is.**
86e0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
86f0: 4e 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a  NRec and *PDbSiz
8700: 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e  e are undefined.
8710: 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52    If JOURNAL_HDR
8720: 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e  _SZ bytes.** can
8730: 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d  not be read from
8740: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
8750: 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  e an error code 
8760: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
8770: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a  static int readJ
8780: 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67  ournalHdr(.  Pag
8790: 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
87a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
87b0: 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
87c0: 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20  nt isHot,.  i64 
87d0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20  journalSize,    
87e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
87f0: 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75   of the open jou
8800: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
8810: 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52  es */.  u32 *pNR
8820: 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ec,             
8830: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c       /* OUT: Val
8840: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
8850: 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20   nRec field */. 
8860: 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20   u32 *pDbSize   
8870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8880: 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f   OUT: Value of o
8890: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
88a0: 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29   size field */.)
88b0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
88c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88d0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
88e0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
88f0: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20  ar aMagic[8];   
8900: 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f    /* A buffer to
8910: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
8920: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20  header */.  i64 
8930: 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
8940: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
8950: 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65  et of journal he
8960: 61 64 65 72 20 62 65 69 6e 67 20 72 65 61 64 20  ader being read 
8970: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73  */..  assert( is
8980: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
8990: 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75  ) );      /* Jou
89a0: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
89b0: 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a  e open. */..  /*
89c0: 20 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a   Advance Pager.j
89d0: 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65  ournalOff to the
89e0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65   start of the ne
89f0: 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68  xt sector. If th
8a00: 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  e.  ** journal f
8a10: 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c  ile is too small
8a20: 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65   for there to be
8a30: 20 61 20 68 65 61 64 65 72 20 73 74 6f 72 65 64   a header stored
8a40: 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f   at this.  ** po
8a50: 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  int, return SQLI
8a60: 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20  TE_DONE..  */.  
8a70: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8a80: 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
8a90: 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
8aa0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
8ab0: 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f  rnalOff+JOURNAL_
8ac0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e  HDR_SZ(pPager) >
8ad0: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a   journalSize ){.
8ae0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8af0: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48  E_DONE;.  }.  iH
8b00: 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
8b10: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f  journalOff;..  /
8b20: 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 66 69  * Read in the fi
8b30: 72 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74  rst 8 bytes of t
8b40: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
8b50: 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f  r. If they do no
8b60: 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65  t match.  ** the
8b70: 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66    magic string f
8b80: 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74 61 72  ound at the star
8b90: 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61  t of each journa
8ba0: 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e  l header, return
8bb0: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  .  ** SQLITE_DON
8bc0: 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  E. If an IO erro
8bd0: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
8be0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20   an error code. 
8bf0: 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20  Otherwise,.  ** 
8c00: 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20  proceed..  */.  
8c10: 69 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64  if( isHot || iHd
8c20: 72 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f  rOff!=pPager->jo
8c30: 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20  urnalHdr ){.    
8c40: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
8c50: 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
8c60: 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  aMagic, sizeof(a
8c70: 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29  Magic), iHdrOff)
8c80: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
8c90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
8ca0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d  .    }.    if( m
8cb0: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
8cc0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
8cd0: 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20  eof(aMagic))!=0 
8ce0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8cf0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
8d00: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61   }.  }..  /* Rea
8d10: 64 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  d the first thre
8d20: 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20  e 32-bit fields 
8d30: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
8d40: 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a  eader: The nRec.
8d50: 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20    ** field, the 
8d60: 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c  checksum-initial
8d70: 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61 74  izer and the dat
8d80: 61 62 61 73 65 20 73 69 7a 65 20 61 74 20 74 68  abase size at th
8d90: 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20  e start.  ** of 
8da0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
8db0: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
8dc0: 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
8dd0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20  g goes wrong..  
8de0: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
8df0: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
8e00: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
8e10: 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52  , iHdrOff+8, pNR
8e20: 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  ec)).   || SQLIT
8e30: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
8e40: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
8e50: 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20  fd, iHdrOff+12, 
8e60: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
8e70: 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  it)).   || SQLIT
8e80: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
8e90: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
8ea0: 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20  fd, iHdrOff+16, 
8eb0: 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20  pDbSize)).  ){. 
8ec0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
8ed0: 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
8ee0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29  >journalOff==0 )
8ef0: 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67 65 53  {.    u32 iPageS
8f00: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
8f10: 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20     /* Page-size 
8f20: 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c  field of journal
8f30: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75   header */.    u
8f40: 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20  32 iSectorSize; 
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8f60: 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64  ector-size field
8f70: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
8f80: 65 72 20 2a 2f 0a 20 20 20 20 75 31 36 20 69 50  er */.    u16 iP
8f90: 61 67 65 53 69 7a 65 31 36 3b 20 20 20 20 20 20  ageSize16;      
8fa0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
8fb0: 66 20 69 50 61 67 65 53 69 7a 65 20 69 6e 20 31  f iPageSize in 1
8fc0: 36 2d 62 69 74 20 76 61 72 69 61 62 6c 65 20 2a  6-bit variable *
8fd0: 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  /..    /* Read t
8fe0: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
8ff0: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75   sector-size jou
9000: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 65 6c  rnal header fiel
9010: 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 53  ds. */.    if( S
9020: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
9030: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
9040: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
9050: 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65  20, &iSectorSize
9060: 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54  )).     || SQLIT
9070: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
9080: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
9090: 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c 20  fd, iHdrOff+24, 
90a0: 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20 20 20  &iPageSize)).   
90b0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
90c0: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
90d0: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
90e0: 65 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72  e values read fr
90f0: 6f 6d 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  om the page-size
9100: 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
9110: 20 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61   fields.    ** a
9120: 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e  re within range.
9130: 20 54 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65   To be 'in range
9140: 27 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e  ', both values n
9150: 65 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  eed to be a powe
9160: 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20  r.    ** of two 
9170: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
9180: 65 71 75 61 6c 20 74 6f 20 35 31 32 2c 20 61 6e  equal to 512, an
9190: 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68  d not greater th
91a0: 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a  an their .    **
91b0: 20 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70   respective comp
91c0: 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d  ile time maximum
91d0: 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a   limits..    */.
91e0: 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a      if( iPageSiz
91f0: 65 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20  e<512           
9200: 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f         || iSecto
9210: 72 53 69 7a 65 3c 35 31 32 0a 20 20 20 20 20 7c  rSize<512.     |
9220: 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49  | iPageSize>SQLI
9230: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
9240: 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e   || iSectorSize>
9250: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a  MAX_SECTOR_SIZE.
9260: 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53       || ((iPageS
9270: 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65  ize-1)&iPageSize
9280: 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63  )!=0   || ((iSec
9290: 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74  torSize-1)&iSect
92a0: 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20  orSize)!=0 .    
92b0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
92c0: 68 65 20 65 69 74 68 65 72 20 74 68 65 20 70 61  he either the pa
92d0: 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f  ge-size or secto
92e0: 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f  r-size in the jo
92f0: 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20  urnal-header is 
9300: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69  .      ** invali
9310: 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63  d, then the proc
9320: 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74  ess that wrote t
9330: 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  he journal-heade
9340: 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20  r must have .   
9350: 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65     ** crashed be
9360: 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 20  fore the header 
9370: 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74  was synced. In t
9380: 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65  his case stop re
9390: 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20  ading .      ** 
93a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
93b0: 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   here..      */.
93c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
93d0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
93e0: 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
93f0: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20  he page-size to 
9400: 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20  match the value 
9410: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
9420: 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55  urnal. .    ** U
9430: 73 65 20 61 20 74 65 73 74 63 61 73 65 28 29 20  se a testcase() 
9440: 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75  macro to make su
9450: 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66  re that malloc f
9460: 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20  ailure within . 
9470: 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61     ** PagerSetPa
9480: 67 65 73 69 7a 65 28 29 20 69 73 20 74 65 73 74  gesize() is test
9490: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
94a0: 50 61 67 65 53 69 7a 65 31 36 20 3d 20 28 75 31  PageSize16 = (u1
94b0: 36 29 69 50 61 67 65 53 69 7a 65 3b 0a 20 20 20  6)iPageSize;.   
94c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
94d0: 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50  erSetPagesize(pP
94e0: 61 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65  ager, &iPageSize
94f0: 31 36 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73  16, -1);.    tes
9500: 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
9510: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  E_OK );.    asse
9520: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
9530: 4b 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 31 36  K || iPageSize16
9540: 3d 3d 28 75 31 36 29 69 50 61 67 65 53 69 7a 65  ==(u16)iPageSize
9550: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61   );..    /* Upda
9560: 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73  te the assumed s
9570: 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61  ector-size to ma
9580: 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73  tch the value us
9590: 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68  ed by .    ** th
95a0: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
95b0: 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72  reated this jour
95c0: 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75  nal. If this jou
95d0: 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20  rnal was.    ** 
95e0: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
95f0: 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20  cess other than 
9600: 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74  this one, then t
9610: 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20  his routine.    
9620: 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  ** is being call
9630: 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70  ed from within p
9640: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e  ager_playback().
9650: 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   The local value
9660: 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72  .    ** of Pager
9670: 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72  .sectorSize is r
9680: 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65  estored at the e
9690: 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69  nd of that routi
96a0: 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ne..    */.    p
96b0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
96c0: 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  e = iSectorSize;
96d0: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
96e0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
96f0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
9700: 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
9710: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  c;.}.../*.** Wri
9720: 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  te the supplied 
9730: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
9740: 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ame into the jou
9750: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
9760: 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74  ger.** pPager at
9770: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
9780: 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65  ation. The maste
9790: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
97a0: 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a  ust be the last.
97b0: 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e  ** thing written
97c0: 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   to a journal fi
97d0: 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  le. If the pager
97e0: 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   is in full-sync
97f0: 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f   mode, the.** jo
9800: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
9810: 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65  iptor is advance
9820: 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  d to the next se
9830: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65  ctor boundary be
9840: 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67  fore.** anything
9850: 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65   is written. The
9860: 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a   format is:.**.*
9870: 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50  *   + 4 bytes: P
9880: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a  AGER_MJ_PGNO..**
9890: 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61     + N bytes: Ma
98a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
98b0: 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a  ename in utf-8..
98c0: 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
98d0: 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73  N (length of mas
98e0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
98f0: 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75   in bytes, no nu
9900: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a  l-terminator)..*
9910: 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d  *   + 4 bytes: M
9920: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
9930: 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  me checksum..** 
9940: 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f    + 8 bytes: aJo
9950: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
9960: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
9970: 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63  ournal page chec
9980: 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20  ksum is the sum 
9990: 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  of the bytes in 
99a0: 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  the master.** jo
99b0: 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72  urnal name, wher
99c0: 65 20 65 61 63 68 20 62 79 74 65 20 69 73 20 69  e each byte is i
99d0: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20  nterpreted as a 
99e0: 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74  signed 8-bit int
99f0: 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  eger..**.** If z
9a00: 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c  Master is a NULL
9a10: 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73   pointer (occurs
9a20: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61   for a single da
9a30: 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
9a40: 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61  on), .** this ca
9a50: 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ll is a no-op..*
9a60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
9a70: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
9a80: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
9a90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
9aa0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
9ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ac0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
9ad0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
9ae0: 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20  nMaster;        
9af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9b00: 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67  Length of string
9b10: 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36   zMaster */.  i6
9b20: 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
9b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9b40: 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64  * Offset of head
9b50: 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69  er in journal fi
9b60: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c  le */.  i64 jrnl
9b70: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
9b80: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
9b90: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   of journal file
9ba0: 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33   on disk */.  u3
9bb0: 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20  2 cksum = 0;    
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9bd0: 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74  * Checksum of st
9be0: 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  ring zMaster */.
9bf0: 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20  .  if( !zMaster 
9c00: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  || pPager->setMa
9c10: 73 74 65 72 0a 20 20 20 7c 7c 20 70 50 61 67 65  ster.   || pPage
9c20: 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
9c30: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
9c40: 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20  E_MEMORY .   || 
9c50: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
9c60: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9c70: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b  ALMODE_OFF .  ){
9c80: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9c90: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61  TE_OK;.  }.  pPa
9ca0: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
9cb0: 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   1;.  assert( is
9cc0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
9cd0: 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75  ) );..  /* Calcu
9ce0: 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20  late the length 
9cf0: 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74 68 65  in bytes and the
9d00: 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61   checksum of zMa
9d10: 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d  ster */.  for(nM
9d20: 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72  aster=0; zMaster
9d30: 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74  [nMaster]; nMast
9d40: 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d  er++){.    cksum
9d50: 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73   += zMaster[nMas
9d60: 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ter];.  }..  /* 
9d70: 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
9d80: 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
9d90: 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
9da0: 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
9db0: 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
9dc0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
9dd0: 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
9de0: 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
9df0: 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
9e00: 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
9e10: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
9e20: 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
9e30: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
9e40: 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  lSync ){.    pPa
9e50: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
9e60: 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
9e70: 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  et(pPager);.  }.
9e80: 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67    iHdrOff = pPag
9e90: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
9ea0: 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
9eb0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64  master journal d
9ec0: 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ata to the end o
9ed0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
9ee0: 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  le. If.  ** an e
9ef0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
9f00: 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
9f10: 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
9f20: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20  ..  */.  if( (0 
9f30: 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
9f40: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
9f50: 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52  , iHdrOff, PAGER
9f60: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
9f70: 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
9f80: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57  (rc = sqlite3OsW
9f90: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
9fa0: 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74  , zMaster, nMast
9fb0: 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29  er, iHdrOff+4)))
9fc0: 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
9fd0: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
9fe0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
9ff0: 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e  Off+4+nMaster, n
a000: 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20  Master))).   || 
a010: 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
a020: 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
a030: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  jfd, iHdrOff+4+n
a040: 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29  Master+4, cksum)
a050: 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
a060: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
a070: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
a080: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
a090: 38 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  8, iHdrOff+4+nMa
a0a0: 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20  ster+8))).  ){. 
a0b0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
a0c0: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
a0d0: 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74  nalOff += (nMast
a0e0: 65 72 2b 32 30 29 3b 0a 20 20 70 50 61 67 65 72  er+20);.  pPager
a0f0: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50  ->needSync = !pP
a100: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a 20  ager->noSync;.. 
a110: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
a120: 20 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74   is in peristent
a130: 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74  -journal mode, t
a140: 68 65 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c  hen the physical
a150: 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66   .  ** journal-f
a160: 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70  ile may extend p
a170: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
a180: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
a190: 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20  l name.  ** and 
a1a0: 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63  8 bytes of magic
a1b0: 20 64 61 74 61 20 6a 75 73 74 20 77 72 69 74 74   data just writt
a1c0: 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20  en to the file. 
a1d0: 54 68 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61  This is .  ** da
a1e0: 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73 65 20  ngerous because 
a1f0: 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c  the code to roll
a200: 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
a210: 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c  al file.  ** wil
a220: 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f  l not be able to
a230: 20 66 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72   find the master
a240: 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f  -journal name to
a250: 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a   determine .  **
a260: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
a270: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68  the journal is h
a280: 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  ot. .  **.  ** E
a290: 61 73 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20  asiest thing to 
a2a0: 64 6f 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61  do in this scena
a2b0: 72 69 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61  rio is to trunca
a2c0: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  te the journal .
a2d0: 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65    ** file to the
a2e0: 20 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a   required size..
a2f0: 20 20 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49    */ .  if( SQLI
a300: 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c  TE_OK==(rc = sql
a310: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
a320: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e  Pager->jfd, &jrn
a330: 6c 53 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72  lSize)).   && jr
a340: 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a  nlSize>pPager->j
a350: 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20  ournalOff.  ){. 
a360: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
a370: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
a380: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
a390: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a  ournalOff);.  }.
a3a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
a3b0: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67  /*.** Find a pag
a3c0: 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61  e in the hash ta
a3d0: 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61  ble given its pa
a3e0: 67 65 20 6e 75 6d 62 65 72 2e 20 52 65 74 75 72  ge number. Retur
a3f0: 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
a400: 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55  o the page or NU
a410: 4c 4c 20 69 66 20 74 68 65 20 72 65 71 75 65 73  LL if the reques
a420: 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20  ted page is not 
a430: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 6d  .** already in m
a440: 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
a450: 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f   PgHdr *pager_lo
a460: 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67  okup(Pager *pPag
a470: 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
a480: 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20    PgHdr *p;     
a490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4a0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
a4b0: 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20  lue */..  /* It 
a4c0: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
a4d0: 66 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20 50 63  for a call to Pc
a4e0: 61 63 68 65 46 65 74 63 68 28 29 20 77 69 74 68  acheFetch() with
a4f0: 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 30 20 74   createFlag==0 t
a500: 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e  o.  ** fail, sin
a510: 63 65 20 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f  ce no attempt to
a520: 20 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69   allocate dynami
a530: 63 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65  c memory will be
a540: 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76   made..  */.  (v
a550: 6f 69 64 29 73 71 6c 69 74 65 33 50 63 61 63 68  oid)sqlite3Pcach
a560: 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70  eFetch(pPager->p
a570: 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c  PCache, pgno, 0,
a580: 20 26 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70   &p);.  return p
a590: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  ;.}../*.** Unles
a5a0: 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  s the pager is i
a5b0: 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 64  n error-state, d
a5c0: 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65  iscard all in-me
a5d0: 6d 6f 72 79 20 70 61 67 65 73 2e 20 49 66 0a 2a  mory pages. If.*
a5e0: 2a 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  * the pager is i
a5f0: 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 74  n error-state, t
a600: 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 20 69 73  hen this call is
a610: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
a620: 54 4f 44 4f 3a 20 57 68 79 20 63 61 6e 20 77 65  TODO: Why can we
a630: 20 6e 6f 74 20 72 65 73 65 74 20 74 68 65 20 70   not reset the p
a640: 61 67 65 72 20 77 68 69 6c 65 20 69 6e 20 65 72  ager while in er
a650: 72 6f 72 20 73 74 61 74 65 3f 0a 2a 2f 0a 73 74  ror state?.*/.st
a660: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
a670: 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  reset(Pager *pPa
a680: 67 65 72 29 7b 0a 20 20 69 66 28 20 53 51 4c 49  ger){.  if( SQLI
a690: 54 45 5f 4f 4b 3d 3d 70 50 61 67 65 72 2d 3e 65  TE_OK==pPager->e
a6a0: 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 73 71  rrCode ){.    sq
a6b0: 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61  lite3BackupResta
a6c0: 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  rt(pPager->pBack
a6d0: 75 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  up);.    sqlite3
a6e0: 50 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67  PcacheClear(pPag
a6f0: 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
a700: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
a710: 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Valid = 0;.  }.}
a720: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
a730: 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74   structures in t
a740: 68 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  he Pager.aSavepo
a750: 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20  int[] array and 
a760: 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65  set both.** Page
a770: 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64  r.aSavepoint and
a780: 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e   Pager.nSavepoin
a790: 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65  t to zero. Close
a7a0: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
a7b0: 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65  .** if it is ope
a7c0: 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  n and the pager 
a7d0: 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  is not in exclus
a7e0: 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ive mode..*/.sta
a7f0: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
a800: 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61  AllSavepoints(Pa
a810: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
a820: 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
a830: 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
a840: 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68  r for looping th
a850: 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53 61 76  rough Pager.aSav
a860: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28  epoint */.  for(
a870: 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d  ii=0; ii<pPager-
a880: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
a890: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  +){.    sqlite3B
a8a0: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
a8b0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
a8c0: 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  ii].pInSavepoint
a8d0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  );.  }.  if( !pP
a8e0: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
a8f0: 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33 49 73  ode || sqlite3Is
a900: 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  MemJournal(pPage
a910: 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20  r->sjfd) ){.    
a920: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
a930: 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20  Pager->sjfd);.  
a940: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
a950: 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
a960: 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  int);.  pPager->
a970: 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  aSavepoint = 0;.
a980: 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70    pPager->nSavep
a990: 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  oint = 0;.  pPag
a9a0: 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b  er->nSubRec = 0;
a9b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
a9c0: 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e  e bit number pgn
a9d0: 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72 53 61  o in the PagerSa
a9e0: 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
a9f0: 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73  oint .** bitvecs
aa00: 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76   of all open sav
aa10: 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20  epoints. Return 
aa20: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
aa30: 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51  cessful.** or SQ
aa40: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20  LITE_NOMEM if a 
aa50: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f  malloc failure o
aa60: 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccurs..*/.static
aa70: 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f   int addToSavepo
aa80: 69 6e 74 42 69 74 76 65 63 73 28 50 61 67 65 72  intBitvecs(Pager
aa90: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
aaa0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20  gno){.  int ii; 
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aac0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
aad0: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  r */.  int rc = 
aae0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
aaf0: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
ab00: 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20  */..  for(ii=0; 
ab10: 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
ab20: 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
ab30: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
ab40: 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61   *p = &pPager->a
ab50: 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20  Savepoint[ii];. 
ab60: 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e     if( pgno<=p->
ab70: 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72  nOrig ){.      r
ab80: 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76  c |= sqlite3Bitv
ab90: 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65  ecSet(p->pInSave
aba0: 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  point, pgno);.  
abb0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
abc0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
abd0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
abe0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
abf0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
ac00: 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  M );.    }.  }. 
ac10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ac20: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
ac30: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
ac40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
ac50: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70  a no-op if the p
ac60: 61 67 65 72 0a 2a 2a 20 69 73 20 69 6e 20 65 78  ager.** is in ex
ac70: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a  clusive mode..**
ac80: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
ac90: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
aca0: 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 69   error state, di
acb0: 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e  scard the conten
acc0: 74 73 20 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61  ts of .** the ca
acd0: 63 68 65 20 61 6e 64 20 72 65 73 65 74 20 74 68  che and reset th
ace0: 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
acf0: 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
ad00: 2e 20 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a  . If there is.**
ad10: 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c   an open journal
ad20: 2d 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20  -file, then the 
ad30: 6e 65 78 74 20 74 69 6d 65 20 61 20 73 68 61 72  next time a shar
ad40: 65 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  ed-lock is obtai
ad50: 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61  ned.** on the pa
ad60: 67 65 72 20 66 69 6c 65 20 28 62 79 20 74 68 69  ger file (by thi
ad70: 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
ad80: 72 6f 63 65 73 73 29 2c 20 69 74 20 77 69 6c 6c  rocess), it will
ad90: 20 62 65 0a 2a 2a 20 74 72 65 61 74 65 64 20 61   be.** treated a
ada0: 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  s a hot-journal 
adb0: 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  and rolled back.
adc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
add0: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
ade0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
adf0: 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
ae00: 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
ae10: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ae30: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
ae40: 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 63  .    /* Always c
ae50: 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lose the journal
ae60: 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70   file when dropp
ae70: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
ae80: 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2a 20 4f 74   lock..    ** Ot
ae90: 68 65 72 77 69 73 65 2c 20 61 6e 6f 74 68 65 72  herwise, another
aea0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
aeb0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65   journal_mode=de
aec0: 6c 65 74 65 20 6d 69 67 68 74 0a 20 20 20 20 2a  lete might.    *
aed0: 2a 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c  * delete the fil
aee0: 65 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  e out from under
aef0: 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   us..    */.    
af00: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
af10: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
af20: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
af30: 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
af40: 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70  nJournal);.    p
af50: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
af60: 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  l = 0;.    relea
af70: 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
af80: 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a  pPager);..    /*
af90: 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
afa0: 75 6e 6c 6f 63 6b 65 64 2c 20 73 6f 6d 65 62 6f  unlocked, somebo
afb0: 64 79 20 65 6c 73 65 20 6d 69 67 68 74 20 63 68  dy else might ch
afc0: 61 6e 67 65 20 69 74 2e 20 54 68 65 0a 20 20 20  ange it. The.   
afd0: 20 2a 2a 20 76 61 6c 75 65 73 20 73 74 6f 72 65   ** values store
afe0: 64 20 69 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  d in Pager.dbSiz
aff0: 65 20 65 74 63 2e 20 6d 69 67 68 74 20 62 65 63  e etc. might bec
b000: 6f 6d 65 20 69 6e 76 61 6c 69 64 20 69 66 0a 20  ome invalid if. 
b010: 20 20 20 2a 2a 20 74 68 69 73 20 68 61 70 70 65     ** this happe
b020: 6e 73 2e 20 54 4f 44 4f 3a 20 52 65 61 6c 6c 79  ns. TODO: Really
b030: 2c 20 74 68 69 73 20 64 6f 65 73 6e 27 74 20 6e  , this doesn't n
b040: 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65  eed to be cleare
b050: 64 0a 20 20 20 20 2a 2a 20 75 6e 74 69 6c 20 74  d.    ** until t
b060: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
b070: 72 20 63 68 65 63 6b 20 66 61 69 6c 73 20 69 6e  r check fails in
b080: 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b   PagerSharedLock
b090: 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ()..    */.    p
b0a0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
b0b0: 69 64 20 3d 20 30 3b 0a 0a 20 20 20 20 72 63 20  id = 0;..    rc 
b0c0: 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  = osUnlock(pPage
b0d0: 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
b0e0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
b0f0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
b100: 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 7d  Code = rc;.    }
b110: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55  .    IOTRACE(("U
b120: 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61  NLOCK %p\n", pPa
b130: 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a 20 49 66  ger))..    /* If
b140: 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69   Pager.errCode i
b150: 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65  s set, the conte
b160: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
b170: 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65   cache cannot be
b180: 0a 20 20 20 20 2a 2a 20 74 72 75 73 74 65 64 2e  .    ** trusted.
b190: 20 4e 6f 77 20 74 68 61 74 20 74 68 65 20 70 61   Now that the pa
b1a0: 67 65 72 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  ger file is unlo
b1b0: 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e  cked, the conten
b1c0: 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ts of the.    **
b1d0: 20 63 61 63 68 65 20 63 61 6e 20 62 65 20 64 69   cache can be di
b1e0: 73 63 61 72 64 65 64 20 61 6e 64 20 74 68 65 20  scarded and the 
b1f0: 65 72 72 6f 72 20 63 6f 64 65 20 73 61 66 65 6c  error code safel
b200: 79 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a  y cleared..    *
b210: 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
b220: 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
b230: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
b240: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
b250: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
b260: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
b270: 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65 72     }.      pager
b280: 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
b290: 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65      }..    pPage
b2a0: 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
b2b0: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ne = 0;.    pPag
b2c0: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
b2d0: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a 7d 0a  R_UNLOCK;.  }.}.
b2e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
b2f0: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 63  tion should be c
b300: 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4f  alled when an IO
b310: 45 52 52 2c 20 43 4f 52 52 55 50 54 20 6f 72 20  ERR, CORRUPT or 
b320: 46 55 4c 4c 20 65 72 72 6f 72 0a 2a 2a 20 6d 61  FULL error.** ma
b330: 79 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 2e  y have occurred.
b340: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
b350: 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
b360: 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 0a 2a   to the pager .*
b370: 2a 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65  * structure, the
b380: 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f   second the erro
b390: 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20  r-code about to 
b3a0: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  be returned by a
b3b0: 20 70 61 67 65 72 20 0a 2a 2a 20 41 50 49 20 66   pager .** API f
b3c0: 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 76 61 6c  unction. The val
b3d0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61  ue returned is a
b3e0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63   copy of the sec
b3f0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a  ond argument .**
b400: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
b410: 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  n. .**.** If the
b420: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
b430: 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   is SQLITE_IOERR
b440: 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  , SQLITE_CORRUPT
b450: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  , or SQLITE_FULL
b460: 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62 65  .** the error be
b470: 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e 74  comes persistent
b480: 2e 20 55 6e 74 69 6c 20 74 68 65 20 70 65 72 73  . Until the pers
b490: 69 73 74 65 6e 20 65 72 72 6f 72 20 69 73 20 63  isten error is c
b4a0: 6c 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62 73 65  leared,.** subse
b4b0: 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73 20  quent API calls 
b4c0: 6f 6e 20 74 68 69 73 20 50 61 67 65 72 20 77 69  on this Pager wi
b4d0: 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72  ll immediately r
b4e0: 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 0a  eturn the same .
b4f0: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  ** error code..*
b500: 2a 0a 2a 2a 20 41 20 70 65 72 73 69 73 74 65 6e  *.** A persisten
b510: 74 20 65 72 72 6f 72 20 69 6e 64 69 63 61 74 65  t error indicate
b520: 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  s that the conte
b530: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
b540: 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f  -cache .** canno
b550: 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 54 68  t be trusted. Th
b560: 69 73 20 73 74 61 74 65 20 63 61 6e 20 62 65 20  is state can be 
b570: 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c  cleared by compl
b580: 65 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67  etely discarding
b590: 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74   .** the content
b5a0: 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63  s of the pager-c
b5b0: 61 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73  ache. If a trans
b5c0: 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76  action was activ
b5d0: 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65  e when.** the pe
b5e0: 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f  rsistent error o
b5f0: 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68  ccurred, then th
b600: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
b610: 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74  al may need.** t
b620: 6f 20 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f  o be replayed to
b630: 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e   restore the con
b640: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74  tents of the dat
b650: 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 69  abase file (as i
b660: 66 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68  f.** it were a h
b670: 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a  ot-journal)..*/.
b680: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
b690: 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50  _error(Pager *pP
b6a0: 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20  ager, int rc){. 
b6b0: 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20   int rc2 = rc & 
b6c0: 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 0a  0xff;.  assert(.
b6d0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
b6e0: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
b6f0: 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50  ULL ||.       pP
b700: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
b710: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20  QLITE_OK ||.    
b720: 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43     (pPager->errC
b730: 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c  ode & 0xff)==SQL
b740: 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20  ITE_IOERR.  );. 
b750: 20 69 66 28 0a 20 20 20 20 72 63 32 3d 3d 53 51   if(.    rc2==SQ
b760: 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20  LITE_FULL ||.   
b770: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   rc2==SQLITE_IOE
b780: 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53  RR ||.    rc2==S
b790: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a 20 20  QLITE_CORRUPT.  
b7a0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
b7b0: 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20  rrCode = rc;.   
b7c0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
b7d0: 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
b7e0: 20 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65   .     && sqlite
b7f0: 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
b800: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
b810: 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  ==0 .    ){.    
b820: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
b830: 72 20 69 73 20 61 6c 72 65 61 64 79 20 75 6e 6c  r is already unl
b840: 6f 63 6b 65 64 2c 20 63 61 6c 6c 20 70 61 67 65  ocked, call page
b850: 72 5f 75 6e 6c 6f 63 6b 28 29 20 6e 6f 77 20 74  r_unlock() now t
b860: 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 72  o.      ** clear
b870: 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
b880: 20 61 6e 64 20 65 6e 73 75 72 65 20 74 68 61 74   and ensure that
b890: 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
b8a0: 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f   is .      ** co
b8b0: 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a  mpletely empty..
b8c0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
b8d0: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
b8e0: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
b8f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b900: 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72  *.** Execute a r
b910: 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61  ollback if a tra
b920: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
b930: 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  ve and unlock th
b940: 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  e .** database f
b950: 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ile. .**.** If t
b960: 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72  he pager has alr
b970: 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65  eady entered the
b980: 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f   error state, do
b990: 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a   not attempt .**
b9a0: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74   the rollback at
b9b0: 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74   this time. Inst
b9c0: 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63  ead, pager_unloc
b9d0: 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54  k() is called. T
b9e0: 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61  he.** call to pa
b9f0: 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c  ger_unlock() wil
ba00: 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e  l discard all in
ba10: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75  -memory pages, u
ba20: 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74  nlock.** the dat
ba30: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 63  abase file and c
ba40: 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73  lear the error s
ba50: 74 61 74 65 2e 20 49 66 20 74 68 69 73 20 6d 65  tate. If this me
ba60: 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 72  ans that.** ther
ba70: 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  e is a hot-journ
ba80: 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  al left in the f
ba90: 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20  ile-system, the 
baa0: 6e 65 78 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  next connection.
bab0: 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73  ** to obtain a s
bac0: 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
bad0: 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d  e pager (which m
bae0: 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20  ay be this one) 
baf0: 77 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20 69 74 20  will.** roll it 
bb00: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
bb10: 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74  he pager has not
bb20: 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
bb30: 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
bb40: 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a  , but an IO or.*
bb50: 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  * malloc error o
bb60: 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72  ccurs during a r
bb70: 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68  ollback, then th
bb80: 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63  is will itself c
bb90: 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67  ause .** the pag
bba0: 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
bbb0: 65 72 72 6f 72 20 73 74 61 74 65 2e 20 57 68 69  error state. Whi
bbc0: 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72  ch will be clear
bbd0: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c  ed by the.** cal
bbe0: 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
bbf0: 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65  k(), as describe
bc00: 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74  d above..*/.stat
bc10: 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
bc20: 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
bc30: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
bc40: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
bc50: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
bc60: 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  && pPager->state
bc70: 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
bc80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
bc90: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
bca0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ();.    sqlite3P
bcb0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61  agerRollback(pPa
bcc0: 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ger);.    sqlite
bcd0: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
bce0: 28 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f  ();.  }.  pager_
bcf0: 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
bd00: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
bd10: 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61  utine ends a tra
bd20: 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e  nsaction. A tran
bd30: 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c  saction is usual
bd40: 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20  ly ended by .** 
bd50: 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20  either a COMMIT 
bd60: 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70  or a ROLLBACK op
bd70: 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f  eration. This ro
bd80: 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c  utine may be cal
bd90: 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f  led .** after ro
bda0: 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d  llback of a hot-
bdb0: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61  journal, or if a
bdc0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
bdd0: 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20  hile opening.** 
bde0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
bdf0: 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
be00: 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e  very first journ
be10: 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a  al-header of a.*
be20: 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  * database trans
be30: 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49  action..** .** I
be40: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
be50: 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6f  n PAGER_SHARED o
be60: 72 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73  r PAGER_UNLOCK s
be70: 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
be80: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
be90: 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
bea0: 6f 70 20 28 72 65 74 75 72 6e 73 20 53 51 4c 49  op (returns SQLI
beb0: 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  TE_OK)..**.** Ot
bec0: 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74  herwise, any act
bed0: 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
bee0: 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  re released..**.
bef0: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
bf00: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20  l file is open, 
bf10: 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61  then it is "fina
bf20: 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a  lized". Once a j
bf30: 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20  ournal .** file 
bf40: 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
bf50: 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  ed it is not pos
bf60: 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20  sible to use it 
bf70: 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a  to roll back a .
bf80: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
bf90: 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63  Nor will it be c
bfa0: 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
bfb0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79  a hot-journal by
bfc0: 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20   this.** or any 
bfd0: 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
bfe0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74  onnection. Exact
bff0: 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c  ly how a journal
c000: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a   is finalized.**
c010: 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
c020: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70  her or not the p
c030: 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
c040: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
c050: 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72  e and.** the cur
c060: 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64  rent journal-mod
c070: 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  e (Pager.journal
c080: 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20  Mode value), as 
c090: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
c0a0: 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45   journalMode==ME
c0b0: 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  MORY.**     Jour
c0c0: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
c0d0: 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c  tor is simply cl
c0e0: 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72  osed. This destr
c0f0: 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69  oys an .**     i
c100: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
c110: 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
c120: 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a  lMode==TRUNCATE.
c130: 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
c140: 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
c150: 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
c160: 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  n size..**.**   
c170: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
c180: 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20  SIST.**     The 
c190: 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f  first 28 bytes o
c1a0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
c1b0: 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54  le are zeroed. T
c1c0: 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a  his invalidates.
c1d0: 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74  **     the first
c1e0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
c1f0: 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64  in the file, and
c200: 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72   hence the entir
c210: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
c220: 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69   file. An invali
c230: 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  d journal file c
c240: 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20  annot be rolled 
c250: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  back..**.**   jo
c260: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54  urnalMode==DELET
c270: 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75  E.**     The jou
c280: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  rnal file is clo
c290: 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20  sed and deleted 
c2a0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
c2b0: 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20  elete()..**.**  
c2c0: 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20     If the pager 
c2d0: 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
c2e0: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
c2f0: 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e  is method of fin
c300: 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74  alizing.**     t
c310: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c320: 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49  is never used. I
c330: 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a  nstead, if the j
c340: 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a  ournalMode is.**
c350: 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20       DELETE and 
c360: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
c370: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
c380: 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72  the method descr
c390: 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20  ibed under.**   
c3a0: 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
c3b0: 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69  ERSIST is used i
c3c0: 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66  nstead..**.** Af
c3d0: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
c3e0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 69 66  is finalized, if
c3f0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d   running in non-
c400: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
c410: 74 68 65 0a 2a 2a 20 70 61 67 65 72 20 6d 6f 76  the.** pager mov
c420: 65 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  es to PAGER_SHAR
c430: 45 44 20 73 74 61 74 65 20 28 61 6e 64 20 64 6f  ED state (and do
c440: 77 6e 67 72 61 64 65 73 20 74 68 65 20 6c 6f 63  wngrades the loc
c450: 6b 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  k on the.** data
c460: 62 61 73 65 20 66 69 6c 65 20 61 63 63 6f 72 64  base file accord
c470: 69 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ingly)..**.** If
c480: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
c490: 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
c4a0: 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 73 20 69  ve mode and is i
c4b0: 6e 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 73  n PAGER_SYNCED s
c4c0: 74 61 74 65 2c 0a 2a 2a 20 69 74 20 6d 6f 76 65  tate,.** it move
c4d0: 73 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55  s to PAGER_EXCLU
c4e0: 53 49 56 45 2e 20 4e 6f 20 6c 6f 63 6b 73 20 61  SIVE. No locks a
c4f0: 72 65 20 64 6f 77 6e 67 72 61 64 65 64 20 77 68  re downgraded wh
c500: 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 0a 2a 2a  en running in.**
c510: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
c520: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
c530: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
c540: 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  no error occurs.
c550: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
c560: 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e  urs during.** an
c570: 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72  y of the IO oper
c580: 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69  ations to finali
c590: 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
c5a0: 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68  ile or unlock th
c5b0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68  e.** database th
c5c0: 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
c5d0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
c5e0: 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66   to the user. If
c5f0: 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69   the .** operati
c600: 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  on to finalize t
c610: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c620: 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20  fails, then the 
c630: 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72  code still.** tr
c640: 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ies to unlock th
c650: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
c660: 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  if not in exclus
c670: 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  ive mode. If the
c680: 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61  .** unlock opera
c690: 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65  tion fails as we
c6a0: 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ll, then the fir
c6b0: 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  st error code re
c6c0: 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  lated.** to the 
c6d0: 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f  first error enco
c6e0: 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75  untered (the jou
c6f0: 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f  rnal finalizatio
c700: 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74  n one) is.** ret
c710: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
c720: 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74   int pager_end_t
c730: 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
c740: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61   *pPager, int ha
c750: 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  sMaster){.  int 
c760: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
c770: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
c780: 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  de from journal 
c790: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65  finalization ope
c7a0: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
c7b0: 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
c7c0: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
c7d0: 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20  de from db file 
c7e0: 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
c7f0: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65   */..  if( pPage
c800: 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
c810: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
c820: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c830: 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 41 6c  .  }.  releaseAl
c840: 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67  lSavepoints(pPag
c850: 65 72 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  er);..  assert( 
c860: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
c870: 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  fd) || pPager->p
c880: 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
c890: 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
c8a0: 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 0a 20 20  ger->jfd) ){..  
c8b0: 20 20 2f 2a 20 54 4f 44 4f 3a 20 54 68 65 72 65    /* TODO: There
c8c0: 27 73 20 61 20 70 72 6f 62 6c 65 6d 20 68 65 72  's a problem her
c8d0: 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 66  e if a journal-f
c8e0: 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 69  ile was opened i
c8f0: 6e 20 4d 45 4d 4f 52 59 0a 20 20 20 20 2a 2a 20  n MEMORY.    ** 
c900: 6d 6f 64 65 20 61 6e 64 20 74 68 65 6e 20 74 68  mode and then th
c910: 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69  e journal-mode i
c920: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 52 55  s changed to TRU
c930: 4e 43 41 54 45 20 6f 72 20 50 45 52 53 49 53 54  NCATE or PERSIST
c940: 0a 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74  .    ** during t
c950: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
c960: 54 68 69 73 20 63 6f 64 65 20 73 68 6f 75 6c 64  This code should
c970: 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61   be changed to a
c980: 73 73 75 6d 65 0a 20 20 20 20 2a 2a 20 74 68 61  ssume.    ** tha
c990: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f  t the journal mo
c9a0: 64 65 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67  de has not chang
c9b0: 65 64 20 73 69 6e 63 65 20 74 68 65 20 74 72 61  ed since the tra
c9c0: 6e 73 61 63 74 69 6f 6e 20 77 61 73 0a 20 20 20  nsaction was.   
c9d0: 20 2a 2a 20 73 74 61 72 74 65 64 2e 20 41 6e 64   ** started. And
c9e0: 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
c9f0: 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 29 20 66  rJournalMode() f
ca00: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  unction should b
ca10: 65 0a 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 64  e.    ** changed
ca20: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
ca30: 61 74 20 74 68 69 73 20 69 73 20 74 68 65 20 63  at this is the c
ca40: 61 73 65 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a  ase too..    */.
ca50: 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65  .    /* Finalize
ca60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
ca70: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  e. */.    if( pP
ca80: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
ca90: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
caa0: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
cab0: 20 20 20 20 20 69 6e 74 20 69 73 4d 65 6d 6f 72       int isMemor
cac0: 79 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  yJournal = sqlit
cad0: 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
cae0: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
caf0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
cb00: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
cb10: 20 20 20 20 20 20 69 66 28 20 21 69 73 4d 65 6d        if( !isMem
cb20: 6f 72 79 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  oryJournal ){.  
cb30: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
cb40: 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
cb50: 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
cb60: 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
cb70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
cb80: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
cb90: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
cba0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
cbb0: 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66  CATE ){.      if
cbc0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
cbd0: 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lOff==0 ){.     
cbe0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
cbf0: 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
cc00: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
cc10: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
cc20: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a  Pager->jfd, 0);.
cc30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
cc40: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
cc50: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
cc60: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
cc70: 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ed = 0;.    }els
cc80: 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78  e if( pPager->ex
cc90: 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20  clusiveMode .   
cca0: 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
ccb0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
ccc0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
ccd0: 49 53 54 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  IST.    ){.     
cce0: 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61   rc = zeroJourna
ccf0: 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61 73  lHdr(pPager, has
cd00: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70  Master);.      p
cd10: 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
cd20: 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 70 50  r, rc);.      pP
cd30: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
cd40: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
cd50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
cd60: 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ed = 0;.    }els
cd70: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
cd80: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
cd90: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
cda0: 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 7c  NALMODE_DELETE |
cdb0: 7c 20 72 63 20 29 3b 0a 20 20 20 20 20 20 73 71  | rc );.      sq
cdc0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
cdd0: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
cde0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
cdf0: 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  OK && !pPager->t
ce00: 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
ce10: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
ce20: 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
ce30: 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
ce40: 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
ce50: 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65    }.    }..#ifde
ce60: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
ce70: 41 47 45 53 0a 20 20 20 20 73 71 6c 69 74 65 33  AGES.    sqlite3
ce80: 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72  PcacheIterateDir
ce90: 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ty(pPager->pPCac
cea0: 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61  he, pager_set_pa
ceb0: 67 65 68 61 73 68 29 3b 0a 23 65 6e 64 69 66 0a  gehash);.#endif.
cec0: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
ced0: 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65  heCleanAll(pPage
cee0: 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20  r->pPCache);.   
cef0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
cf00: 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
cf10: 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70  nJournal);.    p
cf20: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
cf30: 6c 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  l = 0;.    pPage
cf40: 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d  r->nRec = 0;.  }
cf50: 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
cf60: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
cf70: 7b 0a 20 20 20 20 72 63 32 20 3d 20 6f 73 55 6e  {.    rc2 = osUn
cf80: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
cf90: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
cfa0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
cfb0: 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
cfc0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
cfd0: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30  ngeCountDone = 0
cfe0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
cff0: 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
d000: 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20  ER_SYNCED ){.   
d010: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
d020: 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
d030: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
d040: 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
d050: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
d060: 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  c = 0;.  pPager-
d070: 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b  >dbModified = 0;
d080: 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20  ..  /* TODO: Is 
d090: 74 68 69 73 20 6f 70 74 69 6d 61 6c 3f 20 57 68  this optimal? Wh
d0a0: 79 20 69 73 20 74 68 65 20 64 62 20 73 69 7a 65  y is the db size
d0b0: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 68 65 72   invalidated her
d0c0: 65 20 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68 65  e .  ** when the
d0d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
d0e0: 73 20 6e 6f 74 20 75 6e 6c 6f 63 6b 65 64 3f 20  s not unlocked? 
d0f0: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4f  */.  pPager->dbO
d100: 72 69 67 53 69 7a 65 20 3d 20 30 3b 0a 20 20 73  rigSize = 0;.  s
d110: 71 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e  qlite3PcacheTrun
d120: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43  cate(pPager->pPC
d130: 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62  ache, pPager->db
d140: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 21 4d 45  Size);.  if( !ME
d150: 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65  MDB ){.    pPage
d160: 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d  r->dbSizeValid =
d170: 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   0;.  }..  retur
d180: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
d190: 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  ?rc2:rc);.}../*.
d1a0: 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61  ** Parameter aDa
d1b0: 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  ta must point to
d1c0: 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61   a buffer of pPa
d1d0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
d1e0: 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20  tes.** of data. 
d1f0: 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75  Compute and retu
d200: 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61  rn a checksum ba
d210: 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74  sed ont the cont
d220: 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  ents of the .** 
d230: 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64  page of data and
d240: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
d250: 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b  ue of pPager->ck
d260: 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  sumInit..**.** T
d270: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61  his is not a rea
d280: 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69  l checksum. It i
d290: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68  s really just th
d2a0: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a  e sum of the .**
d2b0: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20   random initial 
d2c0: 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63  value (pPager->c
d2d0: 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76  ksumInit) and ev
d2e0: 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a  ery 200th byte.*
d2f0: 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  * of the page da
d300: 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74  ta, starting wit
d310: 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70  h byte offset (p
d320: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25  Pager->pageSize%
d330: 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79  200)..** Each by
d340: 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  te is interprete
d350: 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e  d as an 8-bit un
d360: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a  signed integer..
d370: 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74  **.** Changing t
d380: 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20  he formula used 
d390: 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20  to compute this 
d3a0: 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73  checksum results
d3b0: 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70   in an.** incomp
d3c0: 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66  atible journal f
d3d0: 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  ile format..**.*
d3e0: 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72  * If journal cor
d3f0: 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64  ruption occurs d
d400: 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61  ue to a power fa
d410: 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20  ilure, the most 
d420: 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61  likely .** scena
d430: 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20  rio is that one 
d440: 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72  end or the other
d450: 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77   of the record w
d460: 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20  ill be changed. 
d470: 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c  .** It is much l
d480: 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20  ess likely that 
d490: 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20  the two ends of 
d4a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
d4b0: 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f  rd will be.** co
d4c0: 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69  rrect and the mi
d4d0: 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e  ddle be corrupt.
d4e0: 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68    Thus, this "ch
d4f0: 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a  ecksum" scheme,.
d500: 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61  ** though fast a
d510: 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68  nd simple, catch
d520: 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69  es the mostly li
d530: 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72  kely kind of cor
d540: 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
d550: 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
d560: 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
d570: 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74  , const u8 *aDat
d580: 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  a){.  u32 cksum 
d590: 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
d5a0: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nit;         /* 
d5b0: 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74  Checksum value t
d5c0: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
d5d0: 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
d5e0: 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20  geSize-200;     
d5f0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
d600: 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28  nter */.  while(
d610: 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75   i>0 ){.    cksu
d620: 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20  m += aData[i];. 
d630: 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d     i -= 200;.  }
d640: 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
d650: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
d660: 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f   single page fro
d670: 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75  m either the jou
d680: 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73  rnal file (if is
d690: 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a  MainJrnl==1) or.
d6a0: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ** from the sub-
d6b0: 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61  journal (if isMa
d6c0: 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70  inJrnl==0) and p
d6d0: 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70 61 67  layback that pag
d6e0: 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62  e..** The page b
d6f0: 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20  egins at offset 
d700: 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68  *pOffset into th
d710: 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66  e file. The *pOf
d720: 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73  fset.** value is
d730: 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68   increased to th
d740: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
d750: 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
d760: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
d770: 68 65 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 66 6c  he isMainJrnl fl
d780: 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  ag is true if th
d790: 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20 72  is is the main r
d7a0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
d7b0: 61 6e 64 0a 2a 2a 20 66 61 6c 73 65 20 66 6f 72  and.** false for
d7c0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
d7d0: 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 69  ournal.  The mai
d7e0: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  n rollback journ
d7f0: 61 6c 20 75 73 65 73 0a 2a 2a 20 63 68 65 63 6b  al uses.** check
d800: 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65  sums - the state
d810: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65  ment journal doe
d820: 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  s not..**.** If 
d830: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
d840: 6f 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f  of the page reco
d850: 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  rd read from the
d860: 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
d870: 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65  ile.** is greate
d880: 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
d890: 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  nt value of Page
d8a0: 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70  r.dbSize, then p
d8b0: 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b  layback is.** sk
d8c0: 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45  ipped and SQLITE
d8d0: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
d8e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20  .**.** If pDone 
d8f0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
d900: 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f 72 64  n it is a record
d910: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68   of pages that h
d920: 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62  ave already.** b
d930: 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e  een played back.
d940: 20 20 49 66 20 74 68 65 20 70 61 67 65 20 61 74    If the page at
d950: 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c   *pOffset has al
d960: 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65  ready been playe
d970: 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68  d back.** (if th
d980: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
d990: 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74  pDone bit is set
d9a0: 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20  ) then skip the 
d9b0: 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b  playback..** Mak
d9c0: 65 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65  e sure the pDone
d9d0: 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69   bit correspondi
d9e0: 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73  ng to the *pOffs
d9f0: 65 74 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a  et page is set.*
da00: 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72  * prior to retur
da10: 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ning..**.** If t
da20: 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 69  he page record i
da30: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72  s successfully r
da40: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ead from the (su
da50: 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  b-)journal file.
da60: 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61  ** and played ba
da70: 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  ck, then SQLITE_
da80: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
da90: 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
daa0: 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72  ccurs.** while r
dab0: 65 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72  eading the recor
dac0: 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
dad0: 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72  )journal file or
dae0: 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a   while writing.*
daf0: 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
db00: 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65  e file, then the
db10: 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
db20: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64  s returned. If d
db30: 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73  ata.** is succes
db40: 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  sfully read from
db50: 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
db60: 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70 65  al file but appe
db70: 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72  ars to be.** cor
db80: 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
db90: 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
dba0: 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65   Data is conside
dbb0: 72 65 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e  red corrupted in
dbc0: 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74  .** two circumst
dbd0: 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20  ances:.** .**   
dbe0: 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
dbf0: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69  page-number is i
dc00: 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47  llegal (0 or PAG
dc10: 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a  ER_MJ_PGNO), or.
dc20: 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65  **   * If the re
dc30: 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f  cord is being ro
dc40: 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  lled back from t
dc50: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
dc60: 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20  file.**     and 
dc70: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65  the checksum fie
dc80: 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ld does not matc
dc90: 68 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e  h the record con
dca0: 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74  tent..**.** Neit
dcb0: 68 65 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f  her of these two
dcc0: 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70   scenarios are p
dcd0: 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61  ossible during a
dce0: 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
dcf0: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
dd00: 69 73 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e  is is a savepoin
dd10: 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  t rollback, then
dd20: 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65   memory may have
dd30: 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c   to be dynamical
dd40: 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  ly.** allocated 
dd50: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
dd60: 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
dd70: 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c   case and an all
dd80: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a  ocation fails,.*
dd90: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
dda0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
ddb0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
ddc0: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
ddd0: 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
dde0: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
ddf0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
de00: 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63  being played bac
de10: 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69  k */.  int isMai
de20: 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20  nJrnl,          
de30: 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69       /* 1 -> mai
de40: 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20  n journal. 0 -> 
de50: 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  sub-journal. */.
de60: 20 20 69 6e 74 20 69 73 55 6e 73 79 6e 63 2c 20    int isUnsync, 
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de80: 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61 64 69  /* True if readi
de90: 6e 67 20 66 72 6f 6d 20 75 6e 73 79 6e 63 65 64  ng from unsynced
dea0: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f   main journal */
deb0: 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c  .  i64 *pOffset,
dec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ded0: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65   /* Offset of re
dee0: 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b  cord to playback
def0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65   */.  int isSave
df00: 70 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  pnt,            
df10: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
df20: 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
df30: 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63  back */.  Bitvec
df40: 20 2a 70 44 6f 6e 65 20 20 20 20 20 20 20 20 20   *pDone         
df50: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65          /* Bitve
df60: 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61  c of pages alrea
df70: 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a  dy played back *
df80: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
df90: 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20   PgHdr *pPg;    
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dfb0: 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61  * An existing pa
dfc0: 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  ge in the cache 
dfd0: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dff0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
e000: 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20  umber of a page 
e010: 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
e020: 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20  u32 cksum;      
e030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e040: 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66   Checksum used f
e050: 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  or sanity checki
e060: 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74  ng */.  u8 *aDat
e070: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
e080: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
e090: 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74  ry storage for t
e0a0: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c  he page */.  sql
e0b0: 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20  ite3_file *jfd; 
e0c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
e0d0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
e0e0: 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  r for the journa
e0f0: 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73  l file */..  ass
e100: 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c  ert( (isMainJrnl
e110: 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  &~1)==0 );      
e120: 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73  /* isMainJrnl is
e130: 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73   0 or 1 */.  ass
e140: 65 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26  ert( (isSavepnt&
e150: 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  ~1)==0 );       
e160: 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20  /* isSavepnt is 
e170: 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
e180: 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c  rt( isMainJrnl |
e190: 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f  | pDone );     /
e1a0: 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75  * pDone always u
e1b0: 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e  sed on sub-journ
e1c0: 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  als */.  assert(
e1d0: 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44   isSavepnt || pD
e1e0: 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70  one==0 );   /* p
e1f0: 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20  Done never used 
e200: 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74  on non-savepoint
e210: 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 28   */..  aData = (
e220: 75 38 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70  u8*)pPager->pTmp
e230: 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28  Space;.  assert(
e240: 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20 20   aData );       
e250: 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
e260: 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  e must have alre
e270: 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
e280: 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64  ed */..  /* Read
e290: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
e2a0: 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66   and page data f
e2b0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
e2c0: 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20  or sub-journal. 
e2d0: 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e   ** file. Return
e2e0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74   an error code t
e2f0: 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20  o the caller if 
e300: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
e310: 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d  rs..  */.  jfd =
e320: 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50   isMainJrnl ? pP
e330: 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67  ager->jfd : pPag
e340: 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d  er->sjfd;.  rc =
e350: 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
e360: 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f   *pOffset, &pgno
e370: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
e380: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
e390: 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
e3a0: 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 61 44  e3OsRead(jfd, aD
e3b0: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
e3c0: 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74  eSize, (*pOffset
e3d0: 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  )+4);.  if( rc!=
e3e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
e3f0: 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65  rn rc;.  *pOffse
e400: 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  t += pPager->pag
e410: 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61  eSize + 4 + isMa
e420: 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20  inJrnl*4;..  /* 
e430: 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
e440: 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68  on the page.  Th
e450: 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72  is is more impor
e460: 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67  tant that I orig
e470: 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75  inally.  ** thou
e480: 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72  ght.  If a power
e490: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
e4a0: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
e4b0: 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  l is being writt
e4c0: 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c  en,.  ** it coul
e4d0: 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20  d cause invalid 
e4e0: 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74  data to be writt
e4f0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
e500: 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  nal.  We need to
e510: 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69  .  ** detect thi
e520: 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28  s invalid data (
e530: 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62  with high probab
e540: 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72  ility) and ignor
e550: 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  e it..  */.  if(
e560: 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f   pgno==0 || pgno
e570: 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
e580: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61  pPager) ){.    a
e590: 73 73 65 72 74 28 20 21 69 73 53 61 76 65 70 6e  ssert( !isSavepn
e5a0: 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  t );.    return 
e5b0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
e5c0: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e  .  if( pgno>(Pgn
e5d0: 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  o)pPager->dbSize
e5e0: 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65   || sqlite3Bitve
e5f0: 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e  cTest(pDone, pgn
e600: 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  o) ){.    return
e610: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
e620: 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
e630: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61   ){.    rc = rea
e640: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70  d32bits(jfd, (*p
e650: 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75  Offset)-4, &cksu
e660: 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  m);.    if( rc )
e670: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
e680: 69 66 28 20 21 69 73 53 61 76 65 70 6e 74 20 26  if( !isSavepnt &
e690: 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  & pager_cksum(pP
e6a0: 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63 6b  ager, aData)!=ck
e6b0: 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sum ){.      ret
e6c0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
e6d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
e6e0: 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d  ( pDone && (rc =
e6f0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
e700: 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21  t(pDone, pgno))!
e710: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e720: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
e730: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
e740: 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
e750: 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61  _RESERVED || pPa
e760: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
e770: 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a  R_EXCLUSIVE );..
e780: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
e790: 72 20 69 73 20 69 6e 20 52 45 53 45 52 56 45 44  r is in RESERVED
e7a0: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65   state, then the
e7b0: 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70  re must be a cop
e7c0: 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70  y of this.  ** p
e7d0: 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72  age in the pager
e7e0: 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20   cache. In this 
e7f0: 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65  case just update
e800: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
e810: 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64  ,.  ** not the d
e820: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
e830: 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d  e page is left m
e840: 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74  arked dirty in t
e850: 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20  his case..  **. 
e860: 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e   ** An exception
e870: 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75   to the above ru
e880: 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74 61 62  le: If the datab
e890: 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e  ase is in no-syn
e8a0: 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20  c mode.  ** and 
e8b0: 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20  a page is moved 
e8c0: 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d  during an increm
e8d0: 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65  ental vacuum the
e8e0: 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20  n the page may. 
e8f0: 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68   ** not be in th
e900: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c  e pager cache. L
e910: 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f  ater: if a mallo
e920: 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20  c() or IO error 
e930: 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69  occurs.  ** duri
e940: 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20  ng a Movepage() 
e950: 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70  call, then the p
e960: 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69  age may not be i
e970: 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a  n the cache.  **
e980: 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20   either. So the 
e990: 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69  condition descri
e9a0: 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65  bed in the above
e9b0: 20 70 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f   paragraph is no
e9c0: 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61  t.  ** assert()a
e9d0: 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ble..  **.  ** I
e9e0: 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73  f in EXCLUSIVE s
e9f0: 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70  tate, then we up
ea00: 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
ea10: 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74  ache if it exist
ea20: 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d  s.  ** and the m
ea30: 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ain file. The pa
ea40: 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65  ge is then marke
ea50: 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a  d not dirty..  *
ea60: 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31  *.  ** Ticket #1
ea70: 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d  171:  The statem
ea80: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  ent journal migh
ea90: 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63  t contain page c
eaa0: 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20  ontent that is. 
eab0: 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72   ** different fr
eac0: 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  om the page cont
ead0: 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ent at the start
eae0: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
eaf0: 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f  ion..  ** This o
eb00: 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67  ccurs when a pag
eb10: 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69  e is changed pri
eb20: 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
eb30: 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20  of a statement. 
eb40: 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64   ** then changed
eb50: 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
eb60: 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68  e statement.  Wh
eb70: 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
eb80: 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74  such a.  ** stat
eb90: 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f  ement we must no
eba0: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f  t write to the o
ebb0: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
ebc0: 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a   unless we know.
ebd0: 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e    ** for certain
ebe0: 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70   that original p
ebf0: 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
ec00: 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65   synced into the
ec10: 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
ec20: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74   ** journal.  Ot
ec30: 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72  herwise, a power
ec40: 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76   loss might leav
ec50: 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20  e modified data 
ec60: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  in the.  ** data
ec70: 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75  base file withou
ec80: 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  t an entry in th
ec90: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
eca0: 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a  al that can.  **
ecb0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
ecc0: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
ecd0: 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f  ginal form.  Two
ece0: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74   conditions must
ecf0: 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66   be.  ** met bef
ed00: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ore writing to t
ed10: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
ed20: 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62  s. (1) the datab
ed30: 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ase must be.  **
ed40: 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65   locked.  (2) we
ed50: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
ed60: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
ed70: 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79  tent is fully sy
ed80: 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65  nced.  ** in the
ed90: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69   main journal ei
eda0: 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65  ther because the
edb0: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
edc0: 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20  cache or else.  
edd0: 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d  ** the page is m
ede0: 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e  arked as needSyn
edf0: 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  c==0..  **.  ** 
ee00: 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65  2008-04-14:  Whe
ee10: 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  n attempting to 
ee20: 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74  vacuum a corrupt
ee30: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
ee40: 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69  it.  ** is possi
ee50: 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74  ble to fail a st
ee60: 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74  atement on a dat
ee70: 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73 20  abase that does 
ee80: 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20  not yet exist.. 
ee90: 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d   ** Do not attem
eea0: 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20 64  pt to write if d
eeb0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
eec0: 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e   never been open
eed0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  ed..  */.  pPg =
eee0: 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
eef0: 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61  ager, pgno);.  a
ef00: 73 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d  ssert( pPg || !M
ef10: 45 4d 44 42 20 29 3b 0a 20 20 50 41 47 45 52 54  EMDB );.  PAGERT
ef20: 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20  RACE(("PLAYBACK 
ef30: 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
ef40: 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20  %08x) %s\n",.   
ef50: 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
ef60: 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
ef70: 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  o, pager_datahas
ef80: 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  h(pPager->pageSi
ef90: 7a 65 2c 20 61 44 61 74 61 29 2c 0a 20 20 20 20  ze, aData),.    
efa0: 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d 61             (isMa
efb0: 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75  inJrnl?"main-jou
efc0: 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e  rnal":"sub-journ
efd0: 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28  al").  ));.  if(
efe0: 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e   (pPager->state>
eff0: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
f000: 29 0a 20 20 20 26 26 20 28 70 50 67 3d 3d 30 20  ).   && (pPg==0 
f010: 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67  || 0==(pPg->flag
f020: 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
f030: 43 29 29 0a 20 20 20 26 26 20 69 73 4f 70 65 6e  C)).   && isOpen
f040: 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20  (pPager->fd).   
f050: 26 26 20 21 69 73 55 6e 73 79 6e 63 0a 20 20 29  && !isUnsync.  )
f060: 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d  {.    i64 ofst =
f070: 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
f080: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
f090: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
f0a0: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
f0b0: 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67  >fd, aData, pPag
f0c0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
f0d0: 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  st);.    if( pgn
f0e0: 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
f0f0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Size ){.      pP
f100: 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
f110: 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20   = pgno;.    }. 
f120: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
f130: 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20  Backup ){.      
f140: 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61  CODEC1(pPager, a
f150: 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72  Data, pgno, 3, r
f160: 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  c=SQLITE_NOMEM);
f170: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
f180: 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
f190: 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
f1a0: 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  , aData);.      
f1b0: 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61  CODEC1(pPager, a
f1c0: 44 61 74 61 2c 20 70 67 6e 6f 2c 20 30 2c 20 72  Data, pgno, 0, r
f1d0: 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  c=SQLITE_NOMEM);
f1e0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
f1f0: 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26  f( !isMainJrnl &
f200: 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  & pPg==0 ){.    
f210: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
f220: 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73 61  rollback of a sa
f230: 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74 61  vepoint and data
f240: 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65 6e   was not written
f250: 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   to.    ** the d
f260: 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20  atabase and the 
f270: 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d  page is not in-m
f280: 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73 20  emory, there is 
f290: 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20  a potential.    
f2a0: 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e  ** problem. When
f2b0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 65 78   the page is nex
f2c0: 74 20 66 65 74 63 68 65 64 20 62 79 20 74 68 65  t fetched by the
f2d0: 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20 69   b-tree layer, i
f2e0: 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  t .    ** will b
f2f0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
f300: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
f310: 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20  hich may or may 
f320: 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20 63  not be .    ** c
f330: 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a  urrent. .    **.
f340: 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65      ** There are
f350: 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66   a couple of dif
f360: 66 65 72 65 6e 74 20 77 61 79 73 20 74 68 69 73  ferent ways this
f370: 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c   can happen. All
f380: 20 61 72 65 20 71 75 69 74 65 0a 20 20 20 20 2a   are quite.    *
f390: 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e 20  * obscure. When 
f3a0: 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68  running in synch
f3b0: 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69  ronous mode, thi
f3c0: 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
f3d0: 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65  n .    ** if the
f3e0: 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65 20   page is on the 
f3f0: 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68 65  free-list at the
f400: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
f410: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a  ansaction, then.
f420: 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64      ** populated
f430: 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73 69  , then moved usi
f440: 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  ng sqlite3PagerM
f450: 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20 2a  ovepage()..    *
f460: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c  *.    ** The sol
f470: 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64 20  ution is to add 
f480: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
f490: 65 20 74 6f 20 74 68 65 20 63 61 63 68 65 20 63  e to the cache c
f4a0: 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a  ontaining.    **
f4b0: 20 74 68 65 20 64 61 74 61 20 6a 75 73 74 20 72   the data just r
f4c0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ead from the sub
f4d0: 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74  -journal. Mark t
f4e0: 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
f4f0: 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20   .    ** and if 
f500: 74 68 65 20 70 61 67 65 72 20 72 65 71 75 69 72  the pager requir
f510: 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  es a journal-syn
f520: 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68 65  c, then mark the
f530: 20 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a 2a   page as .    **
f540: 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f 75   requiring a jou
f550: 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65  rnal-sync before
f560: 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e 0a   it is written..
f570: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
f580: 74 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b 0a  t( isSavepnt );.
f590: 20 20 20 20 69 66 28 20 28 72 63 20 3d 20 73 71      if( (rc = sq
f5a0: 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
f5b0: 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  e(pPager, pgno, 
f5c0: 26 70 50 67 2c 20 31 29 29 21 3d 53 51 4c 49 54  &pPg, 1))!=SQLIT
f5d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
f5e0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
f5f0: 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d     pPg->flags &=
f600: 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41   ~PGHDR_NEED_REA
f610: 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  D;.    sqlite3Pc
f620: 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
f630: 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  g);.  }.  if( pP
f640: 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70  g ){.    /* No p
f650: 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20  age should ever 
f660: 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f  be explicitly ro
f670: 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69  lled back that i
f680: 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74  s in use, except
f690: 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  .    ** for page
f6a0: 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64   1 which is held
f6b0: 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72   in use in order
f6c0: 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63   to keep the loc
f6d0: 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
f6e0: 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e  database active.
f6f0: 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20   However such a 
f700: 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c  page may be roll
f710: 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
f720: 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e  ult.    ** of an
f730: 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20   internal error 
f740: 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20  resulting in an 
f750: 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74  automatic call t
f760: 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
f770: 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e  PagerRollback().
f780: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64  .    */.    void
f790: 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61   *pData;.    pDa
f7a0: 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
f7b0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74  .    memcpy(pDat
f7c0: 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72  a, aData, pPager
f7d0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
f7e0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65   if( pPager->xRe
f7f0: 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  initer ){.      
f800: 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
f810: 72 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  r(pPg);.    }.  
f820: 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
f830: 20 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20   && (!isSavepnt 
f840: 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61  || *pOffset<=pPa
f850: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
f860: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
f870: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
f880: 74 68 69 73 20 70 61 67 65 20 77 65 72 65 20 6a  this page were j
f890: 75 73 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f  ust restored fro
f8a0: 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20  m the main .    
f8b0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
f8c0: 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74  e, then its cont
f8d0: 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20 74  ent must be as t
f8e0: 68 65 79 20 77 65 72 65 20 77 68 65 6e 20 74 68  hey were when th
f8f0: 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  e .      ** tran
f900: 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73  saction was firs
f910: 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69  t opened. In thi
f920: 73 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61  s case we can ma
f930: 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  rk the page.    
f940: 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73    ** as clean, s
f950: 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20  ince there will 
f960: 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72  be no need to wr
f970: 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68  ite it out to th
f980: 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
f990: 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e    ** There is on
f9a0: 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74  e exception to t
f9b0: 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74 68 65  his rule. If the
f9c0: 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 72   page is being r
f9d0: 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  olled.      ** b
f9e0: 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66 20 61  ack as part of a
f9f0: 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72 20 73   savepoint (or s
fa00: 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62 61  tatement) rollba
fa10: 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20 20  ck from an .    
fa20: 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70 6f    ** unsynced po
fa30: 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61 69  rtion of the mai
fa40: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  n journal file, 
fa50: 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 73  then it is not s
fa60: 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  afe.      ** to 
fa70: 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
fa80: 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69 73 20   clean. This is 
fa90: 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e 67 20  because marking 
faa0: 74 68 65 20 70 61 67 65 20 61 73 0a 20 20 20 20  the page as.    
fab0: 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c 20    ** clean will 
fac0: 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f  clear the PGHDR_
fad0: 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e 20  NEED_SYNC flag. 
fae0: 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 20 69  Since the page i
faf0: 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61  s.      ** alrea
fb00: 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  dy in the journa
fb10: 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64 65 64  l file (recorded
fb20: 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75   in Pager.pInJou
fb30: 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20 20 20  rnal) and.      
fb40: 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ** the PGHDR_NEE
fb50: 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20 63  D_SYNC flag is c
fb60: 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65 20 70  leared, if the p
fb70: 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 74  age is written t
fb80: 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e  o.      ** again
fb90: 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61   within this tra
fba0: 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77 69 6c  nsaction, it wil
fbb0: 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  l be marked as d
fbc0: 69 72 74 79 20 62 75 74 0a 20 20 20 20 20 20 2a  irty but.      *
fbd0: 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  * the PGHDR_NEED
fbe0: 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c 20  _SYNC flag will 
fbf0: 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74 20 63  not be set. It c
fc00: 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e 74  ould then potent
fc10: 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 62  ially.      ** b
fc20: 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 69 6e  e written out in
fc30: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
fc40: 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74 73 20  file before its 
fc50: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20  journal file.   
fc60: 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73     ** segment is
fc70: 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20 63 72   synced. If a cr
fc80: 61 73 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ash occurs durin
fc90: 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  g or following t
fca0: 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64 61  his,.      ** da
fcb0: 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
fcc0: 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20 20  n may ensue..   
fcd0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
fce0: 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
fcf0: 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 23  an(pPg);.    }.#
fd00: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
fd10: 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67  CK_PAGES.    pPg
fd20: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
fd30: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
fd40: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20  ;.#endif.    /* 
fd50: 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65  If this was page
fd60: 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65   1, then restore
fd70: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
fd80: 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a  ger.dbFileVers..
fd90: 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62      ** Do this b
fda0: 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69  efore any decodi
fdb0: 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ng. */.    if( p
fdc0: 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
fdd0: 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
fde0: 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75  dbFileVers, &((u
fdf0: 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69  8*)pData)[24],si
fe00: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
fe10: 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
fe20: 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20  ..    /* Decode 
fe30: 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65  the page just re
fe40: 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a  ad from disk */.
fe50: 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65      CODEC1(pPage
fe60: 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
fe70: 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
fe80: 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 73 71  E_NOMEM);.    sq
fe90: 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
fea0: 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72  se(pPg);.  }.  r
feb0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
fec0: 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
fed0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
fee0: 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53  ITE_COVERAGE_TES
fef0: 54 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  T)./*.** This ro
ff00: 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 61 68 65 61  utine looks ahea
ff10: 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  d into the main 
ff20: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64  journal file and
ff30: 20 64 65 74 65 72 6d 69 6e 65 73 0a 2a 2a 20 77   determines.** w
ff40: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
ff50: 65 20 6e 65 78 74 20 72 65 63 6f 72 64 20 28 74  e next record (t
ff60: 68 65 20 72 65 63 6f 72 64 20 74 68 61 74 20 62  he record that b
ff70: 65 67 69 6e 73 20 61 74 20 66 69 6c 65 0a 2a 2a  egins at file.**
ff80: 20 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e   offset pPager->
ff90: 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 69 73 20 61  journalOff) is a
ffa0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 70 61 67   well-formed pag
ffb0: 65 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73 74  e record consist
ffc0: 69 6e 67 0a 2a 2a 20 6f 66 20 61 20 76 61 6c 69  ing.** of a vali
ffd0: 64 20 70 61 67 65 20 6e 75 6d 62 65 72 2c 20 70  d page number, p
ffe0: 50 61 67 65 2d 3e 70 61 67 65 53 69 7a 65 20 62  Page->pageSize b
fff0: 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 2c  ytes of content,
10000 20 66 6f 6c 6c 6f 77 65 64 0a 2a 2a 20 62 79 20   followed.** by 
10010 61 20 76 61 6c 69 64 20 63 68 65 63 6b 73 75 6d  a valid checksum
10020 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
10030 72 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f  r never needs to
10040 20 6b 6e 6f 77 20 74 68 69 73 20 69 6e 20 6f 72   know this in or
10050 64 65 72 20 74 6f 20 64 6f 20 69 74 73 20 6a 6f  der to do its jo
10060 62 2e 20 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  b.   This.** rou
10070 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  tine is only use
10080 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 73  d from within as
10090 73 65 72 74 28 29 20 61 6e 64 20 74 65 73 74 63  sert() and testc
100a0 61 73 65 28 29 20 6d 61 63 72 6f 73 2e 0a 2a 2f  ase() macros..*/
100b0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
100c0 72 4e 65 78 74 4a 6f 75 72 6e 61 6c 50 61 67 65  rNextJournalPage
100d0 49 73 56 61 6c 69 64 28 50 61 67 65 72 20 2a 70  IsValid(Pager *p
100e0 50 61 67 65 72 29 7b 0a 20 20 50 67 6e 6f 20 70  Pager){.  Pgno p
100f0 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  gno;           /
10100 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
10110 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  r of the page */
10120 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
10130 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
10140 61 67 65 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  age checksum */.
10150 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
10160 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
10170 20 63 6f 64 65 20 66 72 6f 6d 20 72 65 61 64 20   code from read 
10180 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20  operations */.  
10190 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
101a0 3b 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65  ;    /* The file
101b0 20 64 65 73 63 72 69 70 74 6f 72 20 66 72 6f 6d   descriptor from
101c0 20 77 68 69 63 68 20 77 65 20 61 72 65 20 72 65   which we are re
101d0 61 64 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61  ading */.  u8 *a
101e0 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
101f0 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68  /* Content of th
10200 65 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  e page */..  /* 
10210 52 65 61 64 20 74 68 65 20 70 61 67 65 20 6e 75  Read the page nu
10220 6d 62 65 72 20 68 65 61 64 65 72 20 2a 2f 0a 20  mber header */. 
10230 20 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 6a 66   fd = pPager->jf
10240 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  d;.  rc = read32
10250 62 69 74 73 28 66 64 2c 20 70 50 61 67 65 72 2d  bits(fd, pPager-
10260 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 26 70 67  >journalOff, &pg
10270 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  no);.  if( rc!=S
10280 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74 75  QLITE_OK ){ retu
10290 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20  rn 0; }         
102a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102b0 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45           /*NO_TE
102c0 53 54 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d  ST*/.  if( pgno=
102d0 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
102e0 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
102f0 29 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d  ) ){ return 0; }
10300 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45           /*NO_TE
10310 53 54 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e  ST*/.  if( pgno>
10320 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62  (Pgno)pPager->db
10330 53 69 7a 65 20 29 7b 20 72 65 74 75 72 6e 20 30  Size ){ return 0
10340 3b 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  ; }             
10350 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45           /*NO_TE
10360 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20  ST*/..  /* Read 
10370 74 68 65 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  the checksum */.
10380 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
10390 73 28 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  s(fd, pPager->jo
103a0 75 72 6e 61 6c 4f 66 66 2b 70 50 61 67 65 72 2d  urnalOff+pPager-
103b0 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 26 63 6b  >pageSize+4, &ck
103c0 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  sum);.  if( rc!=
103d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74  SQLITE_OK ){ ret
103e0 75 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20  urn 0; }        
103f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10400 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54            /*NO_T
10410 45 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64  EST*/..  /* Read
10420 20 74 68 65 20 64 61 74 61 20 61 6e 64 20 76 65   the data and ve
10430 72 69 66 79 20 74 68 65 20 63 68 65 63 6b 73 75  rify the checksu
10440 6d 20 2a 2f 0a 20 20 61 44 61 74 61 20 3d 20 28  m */.  aData = (
10450 75 38 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70  u8*)pPager->pTmp
10460 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 73 71  Space;.  rc = sq
10470 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20  lite3OsRead(fd, 
10480 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
10490 61 67 65 53 69 7a 65 2c 20 70 50 61 67 65 72 2d  ageSize, pPager-
104a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 34 29 3b 0a  >journalOff+4);.
104b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
104c0 5f 4f 4b 20 29 7b 20 72 65 74 75 72 6e 20 30 3b  _OK ){ return 0;
104d0 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   }              
104e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104f0 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
10500 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75    if( pager_cksu
10510 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 29  m(pPager, aData)
10520 21 3d 63 6b 73 75 6d 20 29 7b 20 72 65 74 75 72  !=cksum ){ retur
10530 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20  n 0; }          
10540 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
10550 0a 20 20 2f 2a 20 52 65 61 63 68 20 74 68 69 73  .  /* Reach this
10560 20 70 6f 69 6e 74 20 6f 6e 6c 79 20 69 66 20 74   point only if t
10570 68 65 20 70 61 67 65 20 69 73 20 76 61 6c 69 64  he page is valid
10580 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   */.  return 1;.
10590 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
105a0 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
105b0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43  defined(SQLITE_C
105c0 4f 56 45 52 41 47 45 5f 54 45 53 54 29 20 2a 2f  OVERAGE_TEST) */
105d0 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
105e0 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65  r zMaster is the
105f0 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
10600 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
10610 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c  A single journal
10620 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65  .** file that re
10630 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61  ferred to the ma
10640 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
10650 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
10660 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
10670 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
10680 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73  cks if it is pos
10690 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
106a0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
106b0 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20  al file,.** and 
106c0 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73  does so if it is
106d0 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
106e0 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69   zMaster may poi
106f0 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70  nt to Pager.pTmp
10700 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62  Space. So that b
10710 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a  uffer is not .**
10720 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
10730 73 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  se within this f
10740 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57  unction..**.** W
10750 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  hen a master jou
10760 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65  rnal file is cre
10770 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75  ated, it is popu
10780 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  lated with the n
10790 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20  ames .** of all 
107a0 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75  of its child jou
107b0 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72  rnals, one after
107c0 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74   another, format
107d0 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a  ted as utf-8 .**
107e0 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54   encoded text. T
107f0 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63  he end of each c
10800 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild journal fil
10810 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  e is marked with
10820 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69   a .** nul-termi
10830 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30  nator byte (0x00
10840 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69  ). i.e. the enti
10850 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  re contents of a
10860 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
10870 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72  ** file for a tr
10880 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76  ansaction involv
10890 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65  ing two database
108a0 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a  s might be:.**.*
108b0 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  *   "/home/bill/
108c0 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  a.db-journal\x00
108d0 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d  /home/bill/b.db-
108e0 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a  journal\x00".**.
108f0 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72  ** A master jour
10900 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c  nal file may onl
10910 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63  y be deleted onc
10920 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  e all of its chi
10930 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20  ld .** journals 
10940 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64  have been rolled
10950 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   back..**.** Thi
10960 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73  s function reads
10970 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
10980 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
10990 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a  nal file into .*
109a0 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f  * memory and loo
109b0 70 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  ps through each 
109c0 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  of the child jou
109d0 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a  rnal names. For.
109e0 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  ** each child jo
109f0 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73  urnal, it checks
10a00 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69   if:.**.**   * i
10a10 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
10a20 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20  nal exists, and 
10a30 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20  if so.**   * if 
10a40 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
10a50 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66  l contains a ref
10a60 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72  erence to master
10a70 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20   journal .**    
10a80 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a   file zMaster.**
10a90 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a  .** If a child j
10aa0 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
10ab0 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73  und that matches
10ac0 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69   both of the cri
10ad0 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20  teria.** above, 
10ae0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
10af0 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f  turns without do
10b00 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74  ing anything. Ot
10b10 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e  herwise, if.** n
10b20 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75  o such child jou
10b30 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
10b40 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20  d, file zMaster 
10b50 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a  is deleted from.
10b60 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
10b70 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  em using sqlite3
10b80 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a  OsDelete()..**.*
10b90 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
10ba0 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
10bb0 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20  ction, an error 
10bc0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
10bd0 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
10be0 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d  on allocates mem
10bf0 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73  ory by calling s
10c00 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20  qlite3Malloc(). 
10c10 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  If an allocation
10c20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
10c30 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
10c40 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
10c50 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c  if no IO or mall
10c60 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63  oc errors .** oc
10c70 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  cur, SQLITE_OK i
10c80 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
10c90 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e  * TODO: This fun
10ca0 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
10cb0 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f  a single block o
10cc0 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64  f memory to load
10cd0 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63  .** the entire c
10ce0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
10cf0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10d00 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62  le. This could b
10d10 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66  e.** a couple of
10d20 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f   kilobytes or so
10d30 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c   - potentially l
10d40 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70  arger than the p
10d50 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f  age .** size..*/
10d60 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
10d70 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65  r_delmaster(Page
10d80 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
10d90 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
10da0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
10db0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
10dc0 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Vfs;.  int rc;  
10dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10de0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
10df0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
10e00 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f  e *pMaster;    /
10e10 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65  * Malloc'd maste
10e20 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  r-journal file d
10e30 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73  escriptor */.  s
10e40 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f  qlite3_file *pJo
10e50 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c  urnal;   /* Mall
10e60 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e  oc'd child-journ
10e70 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
10e80 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  or */.  char *zM
10e90 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30  asterJournal = 0
10ea0 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66  ; /* Contents of
10eb0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10ec0 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d  file */.  i64 nM
10ed0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20  asterJournal;   
10ee0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
10ef0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10f00 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  le */..  /* Allo
10f10 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 62  cate space for b
10f20 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c  oth the pJournal
10f30 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c   and pMaster fil
10f40 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20  e descriptors.. 
10f50 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75   ** If successfu
10f60 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74  l, open the mast
10f70 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
10f80 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a  for reading..  *
10f90 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73  /.  pMaster = (s
10fa0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71  qlite3_file *)sq
10fb0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
10fc0 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a  pVfs->szOsFile *
10fd0 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20   2);.  pJournal 
10fe0 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
10ff0 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65  *)(((u8 *)pMaste
11000 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46  r) + pVfs->szOsF
11010 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61  ile);.  if( !pMa
11020 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  ster ){.    rc =
11030 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
11040 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73   }else{.    cons
11050 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53  t int flags = (S
11060 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
11070 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
11080 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b  MASTER_JOURNAL);
11090 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
110a0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d  3OsOpen(pVfs, zM
110b0 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20  aster, pMaster, 
110c0 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20  flags, 0);.  }. 
110d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
110e0 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
110f0 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 72 63 20 3d  ter_out;..  rc =
11100 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
11110 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61  ze(pMaster, &nMa
11120 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
11130 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11140 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
11150 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e  er_out;..  if( n
11160 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20  MasterJournal>0 
11170 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f  ){.    char *zJo
11180 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20  urnal;.    char 
11190 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b  *zMasterPtr = 0;
111a0 0a 20 20 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  .    int nMaster
111b0 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  Ptr = pVfs->mxPa
111c0 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f  thname+1;..    /
111d0 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  * Load the entir
111e0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
111f0 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65   file into space
11200 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20   obtained from. 
11210 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61     ** sqlite3_ma
11220 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74  lloc() and point
11230 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
11240 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f  Journal. .    */
11250 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  .    zMasterJour
11260 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71  nal = (char *)sq
11270 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74  lite3Malloc((int
11280 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  )nMasterJournal 
11290 2b 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  + nMasterPtr);. 
112a0 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a     if( !zMasterJ
112b0 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
112c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
112d0 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  M;.      goto de
112e0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
112f0 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65 72 50 74   }.    zMasterPt
11300 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72  r = &zMasterJour
11310 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
11320 61 6c 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  al];.    rc = sq
11330 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73  lite3OsRead(pMas
11340 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
11350 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65  nal, (int)nMaste
11360 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  rJournal, 0);.  
11370 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11380 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
11390 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a  ster_out;..    z
113a0 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65  Journal = zMaste
113b0 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68  rJournal;.    wh
113c0 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a  ile( (zJournal-z
113d0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e  MasterJournal)<n
113e0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
113f0 0a 20 20 20 20 20 20 69 6e 74 20 65 78 69 73 74  .      int exist
11400 73 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  s;.      rc = sq
11410 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
11420 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  fs, zJournal, SQ
11430 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
11440 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20  TS, &exists);.  
11450 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11460 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11470 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
11480 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
11490 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29 7b     if( exists ){
114a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  .        /* One 
114b0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20  of the journals 
114c0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68  pointed to by th
114d0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
114e0 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20   exists..       
114f0 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20   ** Open it and 
11500 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e  check if it poin
11510 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72  ts at the master
11520 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
11530 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75       ** so, retu
11540 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74  rn without delet
11550 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
11560 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
11570 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
11580 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20 69  int c;.        i
11590 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49  nt flags = (SQLI
115a0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
115b0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
115c0 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  N_JOURNAL);.    
115d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
115e0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f  OsOpen(pVfs, zJo
115f0 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c  urnal, pJournal,
11600 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20   flags, 0);.    
11610 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11620 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11630 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
11640 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
11650 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  ..        rc = r
11660 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
11670 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74  (pJournal, zMast
11680 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74  erPtr, nMasterPt
11690 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
116a0 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72  te3OsClose(pJour
116b0 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nal);.        if
116c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
116d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
116e0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
116f0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
11700 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50      c = zMasterP
11710 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63  tr[0]!=0 && strc
11720 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a  mp(zMasterPtr, z
11730 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20  Master)==0;.    
11740 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20      if( c ){.   
11750 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
11760 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
11770 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
11780 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
11790 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67  . */.          g
117a0 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
117b0 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
117c0 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72     }.      zJour
117d0 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53  nal += (sqlite3S
117e0 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c  trlen30(zJournal
117f0 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  )+1);.    }.  }.
11800 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65    .  rc = sqlite
11810 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
11820 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65  zMaster, 0);..de
11830 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69  lmaster_out:.  i
11840 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( zMasterJourna
11850 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
11860 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75  _free(zMasterJou
11870 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69  rnal);.  }  .  i
11880 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  f( pMaster ){.  
11890 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
118a0 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (pMaster);.    a
118b0 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
118c0 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 7d 0a  Journal) );.  }.
118d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
118e0 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
118f0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
11900 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
11910 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20   used to change 
11920 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20  the actual size 
11930 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
11940 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20  .** file in the 
11950 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69  file-system. Thi
11960 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77  s only happens w
11970 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  hen committing a
11980 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a   transaction,.**
11990 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   or rolling back
119a0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28   a transaction (
119b0 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e  including rollin
119c0 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  g back a hot-jou
119d0 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rnal)..**.** If 
119e0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
119f0 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70  e file is not op
11a00 65 6e 2c 20 6f 72 20 61 6e 20 65 78 63 6c 75 73  en, or an exclus
11a10 69 76 65 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 0a  ive lock is not.
11a20 2a 2a 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75  ** held, this fu
11a30 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
11a40 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  p. Otherwise, th
11a50 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
11a60 6c 65 20 69 73 0a 2a 2a 20 63 68 61 6e 67 65 64  le is.** changed
11a70 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20   to nPage pages 
11a80 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70  (nPage*pPager->p
11a90 61 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20  ageSize bytes). 
11aa0 49 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 6f  If the file.** o
11ab0 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e  n disk is curren
11ac0 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20  tly larger than 
11ad0 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68 65  nPage pages, the
11ae0 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a  n use the VFS.**
11af0 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74   xTruncate() met
11b00 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20  hod to truncate 
11b10 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74  it..**.** Or, it
11b20 20 6d 69 67 68 74 20 6d 69 67 68 74 20 62 65 20   might might be 
11b30 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68  the case that th
11b40 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
11b50 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a  s smaller than .
11b60 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20  ** nPage pages. 
11b70 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73  Some operating s
11b80 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61  ystem implementa
11b90 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f  tions can get co
11ba0 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f  nfused if .** yo
11bb0 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74  u try to truncat
11bc0 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65  e a file to some
11bd0 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61   size that is la
11be0 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a  rger than it .**
11bf0 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73   currently is, s
11c00 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61  o detect this ca
11c10 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73  se and write a s
11c20 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20  ingle zero byte 
11c30 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f  to .** the end o
11c40 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69  f the new file i
11c50 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
11c60 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
11c70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  urn SQLITE_OK. I
11c80 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
11c90 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66  curs while modif
11ca0 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61  ying.** the data
11cb0 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72  base file, retur
11cc0 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
11cd0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
11ce0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
11cf0 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67  ger_truncate(Pag
11d00 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
11d10 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
11d20 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11d30 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
11d40 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
11d50 49 56 45 20 26 26 20 69 73 4f 70 65 6e 28 70 50  IVE && isOpen(pP
11d60 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
11d70 20 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65   i64 currentSize
11d80 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 2f  , newSize;.    /
11d90 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61  * TODO: Is it sa
11da0 66 65 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e  fe to use Pager.
11db0 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f  dbFileSize here?
11dc0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
11dd0 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
11de0 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72  Pager->fd, &curr
11df0 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65  entSize);.    ne
11e00 77 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  wSize = pPager->
11e10 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50  pageSize*(i64)nP
11e20 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  age;.    if( rc=
11e30 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75  =SQLITE_OK && cu
11e40 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69  rrentSize!=newSi
11e50 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ze ){.      if( 
11e60 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53  currentSize>newS
11e70 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ize ){.        r
11e80 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
11e90 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64  ncate(pPager->fd
11ea0 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20  , newSize);.    
11eb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11ec0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
11ed0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
11ee0 20 22 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d   "", 1, newSize-
11ef0 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
11f00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11f10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
11f20 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
11f30 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
11f40 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
11f50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11f60 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
11f70 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73 65   of the Pager.se
11f80 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
11f90 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
11fa0 2a 2a 20 70 61 67 65 72 20 62 61 73 65 64 20 6f  ** pager based o
11fb0 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
11fc0 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63  rned by the xSec
11fd0 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a  torSize method.*
11fe0 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61  * of the open da
11ff0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
12000 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
12010 6c 20 62 65 20 75 73 65 64 20 75 73 65 64 20 0a  l be used used .
12020 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
12030 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69  the size and ali
12040 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61  gnment of journa
12050 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a  l header and .**
12060 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12070 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20  pointers within 
12080 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20  created journal 
12090 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  files..**.** For
120a0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
120b0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
120c0 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c  ector size is al
120d0 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a  ways 512 bytes..
120e0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
120f0 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61   for non-tempora
12100 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66  ry files, the ef
12110 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
12120 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61  ize is.** the va
12130 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
12140 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28  the xSectorSize(
12150 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64  ) method rounded
12160 20 75 70 20 74 6f 20 35 31 32 20 69 66 0a 2a 2a   up to 512 if.**
12170 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e   it is less than
12180 20 35 31 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64   512, or rounded
12190 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43   down to MAX_SEC
121a0 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a  TOR_SIZE if it.*
121b0 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
121c0 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  n MAX_SECTOR_SIZ
121d0 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  E..*/.static voi
121e0 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28  d setSectorSize(
121f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
12200 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
12210 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
12220 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
12230 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67   );..  if( !pPag
12240 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
12250 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69      /* Sector si
12260 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  ze doesn't matte
12270 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  r for temporary 
12280 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65  files. Also, the
12290 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79   file.    ** may
122a0 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f   not have been o
122b0 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68  pened yet, in wh
122c0 69 63 68 20 63 61 73 65 20 74 68 65 20 4f 73 53  ich case the OsS
122d0 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
122e0 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67  ** call will seg
122f0 66 61 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  fault..    */.  
12300 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
12310 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  Size = sqlite3Os
12320 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
12330 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66  r->fd);.  }.  if
12340 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
12350 53 69 7a 65 3c 35 31 32 20 29 7b 0a 20 20 20 20  Size<512 ){.    
12360 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
12370 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 0a 20 20  ze = 512;.  }.  
12380 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
12390 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f  orSize>MAX_SECTO
123a0 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73  R_SIZE ){.    as
123b0 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52  sert( MAX_SECTOR
123c0 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20  _SIZE>=512 );.  
123d0 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
123e0 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45 43 54 4f  Size = MAX_SECTO
123f0 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f  R_SIZE;.  }.}../
12400 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
12410 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  e journal and th
12420 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  us restore the d
12430 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a  atabase file to.
12440 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20  ** the state it 
12450 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65  was in before we
12460 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20   started making 
12470 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a  changes.  .**.**
12480 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
12490 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66  e format is as f
124a0 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20  ollows: .**.**  
124b0 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66  (1)  8 byte pref
124c0 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61  ix.  A copy of a
124d0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
124e0 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20  **  (2)  4 byte 
124f0 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
12500 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
12510 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  number of valid 
12520 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20  page records.** 
12530 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75        in the jou
12540 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76  rnal.  If this v
12550 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
12560 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65  ff, then compute
12570 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75   the.**       nu
12580 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
12590 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ords from the jo
125a0 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20  urnal size..**  
125b0 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (3)  4 byte big-
125c0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
125d0 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74  hich is the init
125e0 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ial value for th
125f0 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69  e .**       sani
12600 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  ty checksum..** 
12610 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74   (4)  4 byte int
12620 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
12630 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
12640 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
12650 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
12660 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20  ase to during a 
12670 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35  rollback..**  (5
12680 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
12690 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
126a0 63 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72  ch is the sector
126b0 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64   size.  The head
126c0 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74  er.**       is t
126d0 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69  his many bytes i
126e0 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20  n size..**  (6) 
126f0 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
12700 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
12710 20 69 73 20 74 68 65 20 70 61 67 65 20 63 61 73   is the page cas
12720 65 2e 0a 2a 2a 20 20 28 37 29 20 20 34 20 62 79  e..**  (7)  4 by
12730 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
12740 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
12750 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d  f bytes in the m
12760 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
12770 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68         name.  Th
12780 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  e value may be z
12790 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68  ero (indicate th
127a0 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  at there is no m
127b0 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
127c0 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 38 29  ournal.).**  (8)
127d0 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65    N bytes of the
127e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
127f0 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20  name.  The name 
12800 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d  will be nul-term
12810 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  inated.**       
12820 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f  and might be sho
12830 72 74 65 72 20 74 68 61 6e 20 74 68 65 20 76 61  rter than the va
12840 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35  lue read from (5
12850 29 2e 20 20 49 66 20 74 68 65 20 66 69 72 73 74  ).  If the first
12860 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f   byte.**       o
12870 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30  f the name is \0
12880 30 30 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  00 then there is
12890 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
128a0 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a  al.  The master.
128b0 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c  **       journal
128c0 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20   name is stored 
128d0 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 39  in UTF-8..**  (9
128e0 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  )  Zero or more 
128f0 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c  pages instances,
12900 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73   each as follows
12910 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  :.**        +  4
12920 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
12930 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  r..**        +  
12940 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
12950 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a   bytes of data..
12960 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
12970 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a  yte checksum.**.
12980 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b  ** When we speak
12990 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
129a0 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20  header, we mean 
129b0 74 68 65 20 66 69 72 73 74 20 38 20 69 74 65 6d  the first 8 item
129c0 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68  s above..** Each
129d0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f   entry in the jo
129e0 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74  urnal is an inst
129f0 61 6e 63 65 20 6f 66 20 74 68 65 20 39 74 68 20  ance of the 9th 
12a00 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  item..**.** Call
12a10 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20   the value from 
12a20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65  the second bulle
12a30 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20  t "nRec".  nRec 
12a40 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
12a50 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65  .** valid page e
12a60 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f  ntries in the jo
12a70 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20  urnal.  In most 
12a80 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63  cases, you can c
12a90 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61  ompute the.** va
12aa0 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d  lue of nRec from
12ab0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
12ac0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
12ad0 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a  But if a power.*
12ae0 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  * failure occurr
12af0 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ed while the jou
12b00 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77  rnal was being w
12b10 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64  ritten, it could
12b20 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20   be the.** case 
12b30 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66  that the size of
12b40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12b50 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65  e had already be
12b60 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74  en increased but
12b70 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e  .** the extra en
12b80 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65  tries had not ye
12b90 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79  t made it safely
12ba0 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75   to disk.  In su
12bb0 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68  ch a case,.** th
12bc0 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
12bd0 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68  computed from th
12be0 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c  e file size woul
12bf0 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20  d be too large. 
12c00 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61   For.** that rea
12c10 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75  son, we always u
12c20 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  se the nRec valu
12c30 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  e in the header.
12c40 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52  .**.** If the nR
12c50 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  ec value is 0xff
12c60 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20  ffffff it means 
12c70 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64  that nRec should
12c80 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20   be computed.** 
12c90 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
12ca0 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ze.  This value 
12cb0 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  is used when the
12cc0 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68   user selects th
12cd0 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74  e.** no-sync opt
12ce0 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  ion for the jour
12cf0 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61  nal.  A power fa
12d00 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64  ilure could lead
12d10 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a   to corruption.*
12d20 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  * in this case. 
12d30 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20   But for things 
12d40 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74  like temporary t
12d50 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c  able (which will
12d60 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77   be.** deleted w
12d70 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73  hen the power is
12d80 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f   restored) we do
12d90 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a  n't care.  .**.*
12da0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70  * If the file op
12db0 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72  ened as the jour
12dc0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
12dd0 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a  a well-formed.**
12de0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
12df0 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20  en all pages up 
12e00 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72  to the first cor
12e10 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20  rupted page are 
12e20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28  rolled.** back (
12e30 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74  or no pages if t
12e40 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
12e50 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e  r is corrupted).
12e60 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
12e70 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c  e.** is then del
12e80 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  eted and SQLITE_
12e90 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73  OK returned, jus
12ea0 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75  t as if no corru
12eb0 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65  ption had.** bee
12ec0 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  n encountered..*
12ed0 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f  *.** If an I/O o
12ee0 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
12ef0 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75   occurs, the jou
12f00 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74  rnal-file is not
12f10 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20   deleted.** and 
12f20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
12f30 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
12f40 20 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d   The isHot param
12f50 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74  eter indicates t
12f60 68 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  hat we are tryin
12f70 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  g to rollback a 
12f80 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20  journal.** that 
12f90 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a  might be a hot j
12fa0 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20  ournal.  Or, it 
12fb0 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68  could be that th
12fc0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a  e journal is .**
12fd0 20 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75   preserved becau
12fe0 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44  se of JOURNALMOD
12ff0 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55  E_PERSIST or JOU
13000 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
13010 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  E..** If the jou
13020 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68  rnal really is h
13030 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61  ot, reset the pa
13040 67 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20  ger cache prior 
13050 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20  rolling.** back 
13060 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66  any content.  If
13070 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
13080 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e  merely persisten
13090 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a  t, no reset is.*
130a0 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  * needed..*/.sta
130b0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
130c0 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
130d0 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29  ager, int isHot)
130e0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
130f0 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e  *pVfs = pPager->
13100 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b  pVfs;.  i64 szJ;
13110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13120 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
13130 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
13140 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e  bytes */.  u32 n
13150 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
13160 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13170 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   Records in the 
13180 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
13190 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
131a0 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
131b0 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
131c0 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
131d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
131e0 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
131f0 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
13200 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  es */.  int rc; 
13210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13220 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
13230 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  of a subroutine 
13240 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31  */.  int res = 1
13250 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
13260 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
13270 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  by sqlite3OsAcce
13280 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ss() */.  char *
13290 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20  zMaster = 0;    
132a0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61     /* Name of ma
132b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
132c0 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e  e if any */.  in
132d0 74 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  t needPagerReset
132e0 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74  ;      /* True t
132f0 6f 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69  o reset page pri
13300 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65  or to first page
13310 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20   rollback */..  
13320 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
13330 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
13340 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
13350 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20  l.  Abort early 
13360 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  if.  ** the jour
13370 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  nal is empty..  
13380 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
13390 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
133a0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
133b0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
133c0 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b  ger->jfd, &szJ);
133d0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
133e0 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29  E_OK || szJ==0 )
133f0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
13400 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
13410 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74  /* Read the mast
13420 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
13430 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
13440 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
13450 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61  nt..  ** If a ma
13460 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
13470 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66  e name is specif
13480 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c  ied, but the fil
13490 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72  e is not.  ** pr
134a0 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74  esent on disk, t
134b0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
134c0 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64  is not hot and d
134d0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
134e0 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62  be.  ** played b
134f0 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ack..  **.  ** T
13500 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79  ODO: Technically
13510 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
13520 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75  s an error becau
13530 73 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68  se it assumes th
13540 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50  at.  ** buffer P
13550 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69  ager.pTmpSpace i
13560 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s (mxPathname+1)
13570 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72   bytes or larger
13580 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a  . i.e. that.  **
13590 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69   (pPager->pageSi
135a0 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56  ze >= pPager->pV
135b0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
135c0 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78  ). Using os_unix
135d0 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68  .c,.  **  mxPath
135e0 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69  name is 512, whi
135f0 63 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ch is the same a
13600 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c  s the minimum al
13610 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20  lowable value.  
13620 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e  ** for pageSize.
13630 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20  .  */.  zMaster 
13640 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
13650 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64  ace;.  rc = read
13660 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
13670 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
13680 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
13690 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
136a0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
136b0 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b  E_OK && zMaster[
136c0 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  0] ){.    rc = s
136d0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
136e0 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51  Vfs, zMaster, SQ
136f0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
13700 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20  TS, &res);.  }. 
13710 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
13720 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13730 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20  K || !res ){.   
13740 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
13750 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  ck;.  }.  pPager
13760 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
13770 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73  ;.  needPagerRes
13780 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f  et = isHot;..  /
13790 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d  * This loop term
137a0 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68  inates either wh
137b0 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c  en a readJournal
137c0 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70  Hdr() or .  ** p
137d0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
137e0 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65  e_page() call re
137f0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
13800 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  E or an IO error
13810 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a   .  ** occurs. .
13820 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20    */.  while( 1 
13830 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 55 6e 73  ){.    int isUns
13840 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ync = 0;..    /*
13850 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a   Read the next j
13860 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72  ournal header fr
13870 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
13880 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  ile.  If there a
13890 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e  re.    ** not en
138a0 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20  ough bytes left 
138b0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
138c0 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65  ile for a comple
138d0 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20  te header, or.  
138e0 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75    ** it is corru
138f0 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f  pted, then a pro
13900 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69  cess must of fai
13910 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
13920 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
13930 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
13940 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
13950 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
13960 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
13970 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
13980 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20  (pPager, isHot, 
13990 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
139a0 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
139b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
139c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
139d0 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
139e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
139f0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
13a00 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
13a10 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
13a20 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
13a30 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
13a40 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
13a50 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
13a60 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
13a70 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
13a80 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
13a90 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
13aa0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
13ab0 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
13ac0 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
13ad0 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
13ae0 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
13af0 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
13b00 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
13b10 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
13b20 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
13b30 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
13b40 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
13b50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
13b60 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
13b70 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
13b80 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
13b90 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
13ba0 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
13bb0 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
13bc0 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
13bd0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
13be0 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64  If nRec is 0 and
13bf0 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69   this rollback i
13c00 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  s of a transacti
13c10 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68  on created by th
13c20 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  is.    ** proces
13c30 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73  s and if this is
13c40 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65   the final heade
13c50 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
13c60 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a  , then it means.
13c70 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73      ** that this
13c80 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75   part of the jou
13c90 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66  rnal was being f
13ca0 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f  illed but has no
13cb0 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a  t yet been.    *
13cc0 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  * synced to disk
13cd0 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e  .  Compute the n
13ce0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62  umber of pages b
13cf0 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61  ased on the rema
13d00 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a  ining.    ** siz
13d10 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20  e of the file.. 
13d20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
13d30 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74   third term of t
13d40 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65  he test was adde
13d50 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20  d to fix ticket 
13d60 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68  #2565..    ** Wh
13d70 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
13d80 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e  a hot journal, n
13d90 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65  Rec==0 always me
13da0 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ans that the nex
13db0 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f  t.    ** chunk o
13dc0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f  f the journal co
13dd0 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65  ntains zero page
13de0 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
13df0 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a  ack.  But.    **
13e00 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f   when doing a RO
13e10 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e  LLBACK and the n
13e20 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20  Rec==0 chunk is 
13e30 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69  the last chunk i
13e40 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  n.    ** the jou
13e50 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  rnal, it means t
13e60 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
13e70 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64  might contain ad
13e80 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20  ditional.    ** 
13e90 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20  pages that need 
13ea0 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
13eb0 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e  k and that the n
13ec0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a  umber of pages .
13ed0 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
13ee0 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20   computed based 
13ef0 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
13f00 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  ile size..    */
13f10 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
13f20 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74  Rec==0 && !isHot
13f30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61  .         && pPa
13f40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b  ger->journalHdr+
13f50 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
13f60 50 61 67 65 72 29 21 3d 70 50 61 67 65 72 2d 3e  Pager)!=pPager->
13f70 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 20  journalOff.     
13f80 20 20 20 20 26 26 20 28 28 73 7a 4a 20 2d 20 70      && ((szJ - p
13f90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
13fa0 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  f) / JOURNAL_PG_
13fb0 53 5a 28 70 50 61 67 65 72 29 29 3e 30 0a 20 20  SZ(pPager))>0.  
13fc0 20 20 20 20 20 20 20 26 26 20 70 61 67 65 72 4e         && pagerN
13fd0 65 78 74 4a 6f 75 72 6e 61 6c 50 61 67 65 49 73  extJournalPageIs
13fe0 56 61 6c 69 64 28 70 50 61 67 65 72 29 0a 20 20  Valid(pPager).  
13ff0 20 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 52 65    );.    if( nRe
14000 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26  c==0 && !isHot &
14010 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  &.        pPager
14020 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
14030 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
14040 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
14050 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20  rnalOff ){.     
14060 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73   nRec = (int)((s
14070 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
14080 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e  rnalOff) / JOURN
14090 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
140a0 29 3b 0a 20 20 20 20 20 20 69 73 55 6e 73 79 6e  );.      isUnsyn
140b0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  c = 1;.    }..  
140c0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
140d0 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
140e0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
140f0 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65  ournal, truncate
14100 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
14110 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74  base file back t
14120 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
14130 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
14140 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
14150 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
14160 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
14170 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
14180 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
14190 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20  er, mxPg);.     
141a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
141b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
141c0 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
141d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
141e0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
141f0 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  mxPg;.    }..   
14200 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
14210 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
14220 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  he journal and b
14230 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  ack into the .  
14240 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
14250 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63  le and/or page c
14260 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ache..    */.   
14270 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63   for(u=0; u<nRec
14280 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; u++){.      if
14290 28 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  ( needPagerReset
142a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
142b0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
142c0 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50 61 67  .        needPag
142d0 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20  erReset = 0;.   
142e0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
142f0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
14300 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 31  ne_page(pPager,1
14310 2c 69 73 55 6e 73 79 6e 63 2c 26 70 50 61 67 65  ,isUnsync,&pPage
14320 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c  r->journalOff,0,
14330 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
14340 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14350 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
14360 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
14370 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
14380 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
14390 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
143a0 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
143b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
143c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
143d0 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61        /* If we a
143e0 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c  re unable to rol
143f0 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64 20  lback, quit and 
14400 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
14410 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
14420 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63  de.  This will c
14430 61 75 73 65 20 74 68 65 20 70 61 67 65 72 20 74  ause the pager t
14440 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f  o enter the erro
14450 72 20 73 74 61 74 65 0a 20 20 20 20 20 20 20 20  r state.        
14460 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20    ** so that no 
14470 66 75 72 74 68 65 72 20 68 61 72 6d 20 77 69 6c  further harm wil
14480 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72 68  l be done.  Perh
14490 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20 20  aps the next.   
144a0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
144b0 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20  s to come along 
144c0 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20  will be able to 
144d0 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61 74  rollback the dat
144e0 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20  abase..         
144f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f   */.          go
14500 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
14510 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14520 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
14530 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20  *NOTREACHED*/.  
14540 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e  assert( 0 );..en
14550 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a  d_playback:.  /*
14560 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c   Following a rol
14570 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62  lback, the datab
14580 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  ase file should 
14590 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f  be back in its o
145a0 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61  riginal.  ** sta
145b0 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  te prior to the 
145c0 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
145d0 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76  nsaction, so inv
145e0 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c  oke the.  ** SQL
145f0 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
14600 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74  HANGED file-cont
14610 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69  rol method to di
14620 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61  sable the.  ** a
14630 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68  ssertion that th
14640 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
14650 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69  unter was modifi
14660 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
14670 74 28 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66  t(.    pPager->f
14680 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d 30 20 7c  d->pMethods==0 |
14690 7c 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  |.    sqlite3OsF
146a0 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65  ileControl(pPage
146b0 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e  r->fd,SQLITE_FCN
146c0 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c  TL_DB_UNCHANGED,
146d0 30 29 3e 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  0)>=SQLITE_OK.  
146e0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
146f0 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70   playback is hap
14700 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63  pening automatic
14710 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74  ally as a result
14720 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20   of an IO or .  
14730 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20  ** malloc error 
14740 74 68 61 74 20 6f 63 63 75 72 72 65 64 20 61 66  that occurred af
14750 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ter the change-c
14760 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
14770 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66  ed but .  ** bef
14780 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
14790 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65  ion was committe
147a0 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e  d, then the chan
147b0 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a  ge-counter .  **
147c0 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61   modification ma
147d0 79 20 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e  y just have been
147e0 20 72 65 76 65 72 74 65 64 2e 20 49 66 20 74 68   reverted. If th
147f0 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78  is happens in ex
14800 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f  clusive .  ** mo
14810 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75  de, then subsequ
14820 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ent transactions
14830 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68   performed by th
14840 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c  e connection wil
14850 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74  l not.  ** updat
14860 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
14870 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69  nter at all. Thi
14880 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61  s may lead to ca
14890 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63  che inconsistenc
148a0 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20  y.  ** problems 
148b0 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73  for other proces
148c0 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e  ses at some poin
148d0 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e  t in the future.
148e0 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69   So, just.  ** i
148f0 6e 20 63 61 73 65 20 74 68 69 73 20 68 61 73 20  n case this has 
14900 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20  happened, clear 
14910 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  the changeCountD
14920 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20  one flag now..  
14930 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  */.  pPager->cha
14940 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
14950 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
14960 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
14970 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61  TE_OK ){.    zMa
14980 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
14990 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63  TmpSpace;.    rc
149a0 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
149b0 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
149c0 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
149d0 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
149e0 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74  ame+1);.    test
149f0 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
14a00 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  _OK );.  }.  if(
14a10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14a20 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
14a30 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
14a40 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
14a50 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a 20 20 20 20  [0]!='\0');.    
14a60 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
14a70 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
14a80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14a90 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d  OK && zMaster[0]
14aa0 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f   && res ){.    /
14ab0 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
14ac0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
14ad0 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  and this routine
14ae0 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63   will return suc
14af0 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65  cess,.    ** see
14b00 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
14b10 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
14b20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
14b30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
14b40 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
14b50 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
14b60 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
14b70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14b80 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
14b90 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
14ba0 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61   variable may ha
14bb0 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20  ve been updated 
14bc0 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20  while rolling.  
14bd0 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ** back a journa
14be0 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  l created by a p
14bf0 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69  rocess with a di
14c00 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73  fferent sector s
14c10 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  ize.  ** value. 
14c20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20  Reset it to the 
14c30 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f  correct value fo
14c40 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  r this process..
14c50 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72    */.  setSector
14c60 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
14c70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
14c80 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73 61 76  .** Playback sav
14c90 65 70 6f 69 6e 74 20 70 53 61 76 65 70 6f 69 6e  epoint pSavepoin
14ca0 74 2e 20 4f 72 2c 20 69 66 20 70 53 61 76 65 70  t. Or, if pSavep
14cb0 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e  oint==NULL, then
14cc0 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65   playback.** the
14cd0 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
14ce0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
14cf0 20 63 61 73 65 20 70 53 61 76 65 70 6f 69 6e 74   case pSavepoint
14d00 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77 68  ==NULL occurs wh
14d10 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43  en .** a ROLLBAC
14d20 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20  K TO command is 
14d30 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56  invoked on a SAV
14d40 45 50 4f 49 4e 54 20 74 68 61 74 20 69 73 20 61  EPOINT that is a
14d50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a   transaction .**
14d60 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a   savepoint..**.*
14d70 2a 20 57 68 65 6e 20 70 53 61 76 65 70 6f 69 6e  * When pSavepoin
14d80 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d  t is not NULL (m
14d90 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61  eaning a non-tra
14da0 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
14db0 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20  nt is .** being 
14dc0 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74 68  rolled back), th
14dd0 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
14de0 63 6f 6e 73 69 73 74 73 20 6f 66 20 75 70 20 74  consists of up t
14df0 6f 20 74 68 72 65 65 20 73 74 61 67 65 73 2c 0a  o three stages,.
14e00 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 69 6e 20  ** performed in 
14e10 74 68 65 20 6f 72 64 65 72 20 73 70 65 63 69 66  the order specif
14e20 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50  ied:.**.**   * P
14e30 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 20  ages are played 
14e40 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
14e50 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
14e60 69 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a 20 20  ing at byte.**  
14e70 20 20 20 6f 66 66 73 65 74 20 50 61 67 65 72 53     offset PagerS
14e80 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74  avepoint.iOffset
14e90 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
14ea0 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72  to .**     Pager
14eb0 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
14ec0 66 73 65 74 2c 20 6f 72 20 74 6f 20 74 68 65 20  fset, or to the 
14ed0 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  end of the main 
14ee0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66  journal.**     f
14ef0 69 6c 65 20 69 66 20 50 61 67 65 72 53 61 76 65  ile if PagerSave
14f00 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
14f10 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20   is zero..**.** 
14f20 20 20 2a 20 49 66 20 50 61 67 65 72 53 61 76 65    * If PagerSave
14f30 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
14f40 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
14f50 65 6e 20 70 61 67 65 73 20 61 72 65 20 70 6c 61  en pages are pla
14f60 79 65 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20  yed.**     back 
14f70 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 74 68  starting from th
14f80 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
14f90 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
14fa0 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50  lowing .**     P
14fb0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
14fc0 64 72 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  drOffset to the 
14fd0 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  end of the main 
14fe0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
14ff0 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72  .**   * Pages ar
15000 65 20 74 68 65 6e 20 70 6c 61 79 65 64 20 62 61  e then played ba
15010 63 6b 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ck from the sub-
15020 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74  journal file, st
15030 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69  arting.**     wi
15040 74 68 20 74 68 65 20 50 61 67 65 72 53 61 76 65  th the PagerSave
15050 70 6f 69 6e 74 2e 69 53 75 62 52 65 63 20 61 6e  point.iSubRec an
15060 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
15070 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20  the end of.**   
15080 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    the journal fi
15090 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67  le..**.** Throug
150a0 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63  hout the rollbac
150b0 6b 20 70 72 6f 63 65 73 73 2c 20 65 61 63 68 20  k process, each 
150c0 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 72  time a page is r
150d0 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 0a  olled back, the.
150e0 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
150f0 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 61   bit is set in a
15100 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72   bitvec structur
15110 65 20 28 76 61 72 69 61 62 6c 65 20 70 44 6f 6e  e (variable pDon
15120 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c  e in the.** impl
15130 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77  ementation below
15140 29 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  ). This is used 
15150 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 61  to ensure that a
15160 20 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a   page is only.**
15170 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
15180 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 20 69   first time it i
15190 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e  s encountered in
151a0 20 65 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e   either journal.
151b0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65 70  .**.** If pSavep
151c0 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  oint is NULL, th
151d0 65 6e 20 70 61 67 65 73 20 61 72 65 20 6f 6e 6c  en pages are onl
151e0 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  y played back fr
151f0 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a  om the main.** j
15200 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
15210 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f  re is no need fo
15220 72 20 61 20 62 69 74 76 65 63 20 69 6e 20 74 68  r a bitvec in th
15230 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
15240 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 62  n either case, b
15250 65 66 6f 72 65 20 70 6c 61 79 62 61 63 6b 20 63  efore playback c
15260 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20 50 61 67  ommences the Pag
15270 65 72 2e 64 62 53 69 7a 65 20 76 61 72 69 61 62  er.dbSize variab
15280 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65 74 20 74  le.** is reset t
15290 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68 61 74  o the value that
152a0 20 69 74 20 68 65 6c 64 20 61 74 20 74 68 65 20   it held at the 
152b0 73 74 61 72 74 20 6f 66 20 74 68 65 20 73 61 76  start of the sav
152c0 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74  epoint .** (or t
152d0 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20  ransaction). No 
152e0 70 61 67 65 20 77 69 74 68 20 61 20 70 61 67 65  page with a page
152f0 2d 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20  -number greater 
15300 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 0a  than this value.
15310 2a 2a 20 69 73 20 70 6c 61 79 65 64 20 62 61 63  ** is played bac
15320 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20 65 6e 63  k. If one is enc
15330 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20 73  ountered it is s
15340 69 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a  imply skipped..*
15350 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
15360 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
15370 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
15380 72 2c 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  r, PagerSavepoin
15390 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a  t *pSavepoint){.
153a0 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
153b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 66             /* Ef
153c0 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20  fective size of 
153d0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
153e0 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
153f0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
15400 2a 20 45 6e 64 20 6f 66 20 66 69 72 73 74 20 73  * End of first s
15410 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a  egment of main-j
15420 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a  ournal records *
15430 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
15440 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20  ITE_OK;      /* 
15450 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
15460 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d   Bitvec *pDone =
15470 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74   0;       /* Bit
15480 76 65 63 20 74 6f 20 65 6e 73 75 72 65 20 70 61  vec to ensure pa
15490 67 65 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ges played back 
154a0 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20  only once */..  
154b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
154c0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
154d0 52 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  RED );..  /* All
154e0 6f 63 61 74 65 20 61 20 62 69 74 76 65 63 20 74  ocate a bitvec t
154f0 6f 20 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74  o use to store t
15500 68 65 20 73 65 74 20 6f 66 20 70 61 67 65 73 20  he set of pages 
15510 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20  rolled back */. 
15520 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20   if( pSavepoint 
15530 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73  ){.    pDone = s
15540 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
15550 74 65 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e  te(pSavepoint->n
15560 4f 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21  Orig);.    if( !
15570 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72  pDone ){.      r
15580 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
15590 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  EM;.    }.  }.. 
155a0 20 2f 2a 20 53 65 74 20 74 68 65 20 64 61 74 61   /* Set the data
155b0 62 61 73 65 20 73 69 7a 65 20 62 61 63 6b 20 74  base size back t
155c0 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 77  o the value it w
155d0 61 73 20 62 65 66 6f 72 65 20 74 68 65 20 73 61  as before the sa
155e0 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65  vepoint .  ** be
155f0 69 6e 67 20 72 65 76 65 72 74 65 64 20 77 61 73  ing reverted was
15600 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20   opened..  */.  
15610 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
15620 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20 70 53   pSavepoint ? pS
15630 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20  avepoint->nOrig 
15640 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  : pPager->dbOrig
15650 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 55 73 65 20  Size;..  /* Use 
15660 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15670 66 66 20 61 73 20 74 68 65 20 65 66 66 65 63 74  ff as the effect
15680 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
15690 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  main rollback.  
156a0 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  ** journal.  The
156b0 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67   actual file mig
156c0 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ht be larger tha
156d0 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50  n this in.  ** P
156e0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
156f0 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47  _TRUNCATE or PAG
15700 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
15710 45 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79  ERSIST.  But any
15720 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20  thing.  ** past 
15730 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15740 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73  ff is off-limits
15750 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73   to us..  */.  s
15760 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ = pPager->jou
15770 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 42  rnalOff;..  /* B
15780 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20  egin by rolling 
15790 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f  back records fro
157a0 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
157b0 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20  al starting at. 
157c0 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
157d0 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63  nt.iOffset and c
157e0 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
157f0 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
15800 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65  ader..  ** There
15810 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64   might be record
15820 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  s in the main jo
15830 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20  urnal that have 
15840 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  a page number.  
15850 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
15860 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
15870 62 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65  base size (pPage
15880 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74  r->dbSize) but t
15890 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  hose.  ** will b
158a0 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61  e skipped automa
158b0 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20  tically.  Pages 
158c0 61 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f  are added to pDo
158d0 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20  ne as they.  ** 
158e0 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e  are played back.
158f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  .  */.  if( pSav
15900 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 69 48  epoint ){.    iH
15910 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69  drOff = pSavepoi
15920 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3f  nt->iHdrOffset ?
15930 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64   pSavepoint->iHd
15940 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20  rOffset : szJ;. 
15950 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
15960 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69  alOff = pSavepoi
15970 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20  nt->iOffset;.   
15980 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
15990 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
159a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72  >journalOff<iHdr
159b0 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Off ){.      rc 
159c0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
159d0 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
159e0 2c 20 31 2c 20 30 2c 20 26 70 50 61 67 65 72 2d  , 1, 0, &pPager-
159f0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 2c 20  >journalOff, 1, 
15a00 70 44 6f 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pDone);.    }.  
15a10 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
15a20 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
15a30 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
15a40 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
15a50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74  ;.  }..  /* Cont
15a60 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63  inue rolling bac
15a70 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66  k records out of
15a80 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
15a90 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
15aa0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  ** the first jou
15ab0 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e  rnal header seen
15ac0 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
15ad0 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63 74  until the effect
15ae0 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20  ive end.  ** of 
15af0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
15b00 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65   file.  Continue
15b10 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d   to skip out-of-
15b20 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a  range pages and.
15b30 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64    ** continue ad
15b40 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65  ding pages rolle
15b50 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e  d back to pDone.
15b60 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72  .  */.  while( r
15b70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
15b80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15b90 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33  ff<szJ ){.    u3
15ba0 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  2 ii;           
15bb0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
15bc0 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65   */.    u32 nJRe
15bd0 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75  c = 0;     /* Nu
15be0 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20  mber of Journal 
15bf0 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75  Records */.    u
15c00 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63  32 dummy;.    rc
15c10 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
15c20 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a  r(pPager, 0, szJ
15c30 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79  , &nJRec, &dummy
15c40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
15c50 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
15c60 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ;..    /*.    **
15c70 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f   The "pPager->jo
15c80 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
15c90 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
15ca0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
15cb0 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74  Off".    ** test
15cc0 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74   is related to t
15cd0 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65  icket #2565.  Se
15ce0 65 20 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e  e the discussion
15cf0 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70   in the.    ** p
15d00 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
15d10 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64  function for add
15d20 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
15d30 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
15d40 61 73 73 65 72 74 28 20 21 28 6e 4a 52 65 63 3d  assert( !(nJRec=
15d50 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  =0.         && p
15d60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
15d70 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
15d80 28 70 50 61 67 65 72 29 21 3d 70 50 61 67 65 72  (pPager)!=pPager
15d90 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20  ->journalOff.   
15da0 20 20 20 20 20 20 26 26 20 28 28 73 7a 4a 20 2d        && ((szJ -
15db0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15dc0 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50  Off) / JOURNAL_P
15dd0 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3e 30 0a  G_SZ(pPager))>0.
15de0 20 20 20 20 20 20 20 20 20 26 26 20 70 61 67 65           && page
15df0 72 4e 65 78 74 4a 6f 75 72 6e 61 6c 50 61 67 65  rNextJournalPage
15e00 49 73 56 61 6c 69 64 28 70 50 61 67 65 72 29 29  IsValid(pPager))
15e10 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
15e20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26  nJRec==0 .     &
15e30 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
15e40 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
15e50 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
15e60 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
15e70 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52      ){.      nJR
15e80 65 63 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20  ec = (u32)((szJ 
15e90 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
15ea0 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47  lOff)/JOURNAL_PG
15eb0 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
15ec0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30    }.    for(ii=0
15ed0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
15ee0 26 26 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70  && ii<nJRec && p
15ef0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
15f00 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20  f<szJ; ii++){.  
15f10 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
15f20 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
15f30 28 70 50 61 67 65 72 2c 20 31 2c 20 30 2c 20 26  (pPager, 1, 0, &
15f40 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15f50 66 66 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20  ff, 1, pDone);. 
15f60 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
15f70 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
15f80 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   );.  }.  assert
15f90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15fa0 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
15fb0 61 6c 4f 66 66 3d 3d 73 7a 4a 20 29 3b 0a 0a 20  alOff==szJ );.. 
15fc0 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f   /* Finally,  ro
15fd0 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72 6f  llback pages fro
15fe0 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
15ff0 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20 77 65  l.  Page that we
16000 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73  re.  ** previous
16010 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f  ly rolled back o
16020 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ut of the main j
16030 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65 20  ournal (and are 
16040 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a  hence in pDone).
16050 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69    ** will be ski
16060 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61  pped.  Out-of-ra
16070 6e 67 65 20 70 61 67 65 73 20 61 72 65 20 61 6c  nge pages are al
16080 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  so skipped..  */
16090 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
160a0 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b  t ){.    u32 ii;
160b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
160c0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
160d0 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
160e0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62  pSavepoint->iSub
160f0 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  Rec*(4+pPager->p
16100 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 66 6f  ageSize);.    fo
16110 72 28 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d  r(ii=pSavepoint-
16120 3e 69 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51  >iSubRec; rc==SQ
16130 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50  LITE_OK && ii<pP
16140 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69  ager->nSubRec; i
16150 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
16160 72 74 28 20 6f 66 66 73 65 74 3d 3d 69 69 2a 28  rt( offset==ii*(
16170 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
16180 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ze) );.      rc 
16190 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
161a0 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
161b0 2c 20 30 2c 20 30 2c 20 26 6f 66 66 73 65 74 2c  , 0, 0, &offset,
161c0 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20 20   1, pDone);.    
161d0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
161e0 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
161f0 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42  .  }..  sqlite3B
16200 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f  itvecDestroy(pDo
16210 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ne);.  if( rc==S
16220 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16230 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
16240 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20  ff = szJ;.  }.  
16250 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16260 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d  .** Change the m
16270 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
16280 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
16290 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65   that are allowe
162a0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
162b0 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
162c0 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
162d0 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
162e0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
162f0 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67  etCachesize(pPag
16300 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50  er->pPCache, mxP
16310 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  age);.}../*.** A
16320 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74  djust the robust
16330 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61  ness of the data
16340 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64  base to damage d
16350 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
16360 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69  .** or power fai
16370 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e  lures by changin
16380 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  g the number of 
16390 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72  syncs()s when wr
163a0 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c  iting.** the rol
163b0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20  lback journal.  
163c0 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
163d0 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  levels:.**.**   
163e0 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74   OFF       sqlit
163f0 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65  e3OsSync() is ne
16400 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69  ver called.  Thi
16410 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
16420 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
16430 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61   for temporary a
16440 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c  nd transient fil
16450 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52  es..**.**    NOR
16460 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  MAL    The journ
16470 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63  al is synced onc
16480 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
16490 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
164a0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
164b0 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20  abase.  This is 
164c0 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74  normally adequat
164d0 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75  e protection, bu
164e0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
164f0 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69    it is theoreti
16500 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20  cally possible, 
16510 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69  though very unli
16520 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20  kely,.**        
16530 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e        that an in
16540 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66  opertune power f
16550 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
16560 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  ve the journal.*
16570 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
16580 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20  n a state which 
16590 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61  would cause dama
165a0 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
165b0 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  se.**           
165c0 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f     when it is ro
165d0 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
165e0 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68      FULL      Th
165f0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
16600 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65  ced twice before
16610 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
16620 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
16630 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77       database (w
16640 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f  ith some additio
16650 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
16660 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  - the nRec field
16670 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
16680 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
16690 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77  header - being w
166a0 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65  ritten in betwee
166b0 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20  n the two.**    
166c0 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29            syncs)
166d0 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20  .  If we assume 
166e0 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a  that writing a.*
166f0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
16700 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
16710 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65  r is atomic, the
16720 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76  n this mode prov
16730 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ides.**         
16740 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74       assurance t
16750 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
16760 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72  will not be corr
16770 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  upted to the.** 
16780 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69               poi
16790 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61  nt of causing da
167a0 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
167b0 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  base during roll
167c0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65  back..**.** Nume
167d0 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63  ric values assoc
167e0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65  iated with these
167f0 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d   states are OFF=
16800 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a  =1, NORMAL=2,.**
16810 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a   and FULL=3..*/.
16820 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16830 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
16840 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  S.void sqlite3Pa
16850 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65  gerSetSafetyLeve
16860 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
16870 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20   int level, int 
16880 62 46 75 6c 6c 46 73 79 6e 63 29 7b 0a 20 20 70  bFullFsync){.  p
16890 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
168a0 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50   (level==1 || pP
168b0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20  ager->tempFile) 
168c0 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ?1:0;.  pPager->
168d0 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76 65  fullSync = (leve
168e0 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d  l==3 && !pPager-
168f0 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b  >tempFile) ?1:0;
16900 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  .  pPager->sync_
16910 66 6c 61 67 73 20 3d 20 28 62 46 75 6c 6c 46 73  flags = (bFullFs
16920 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ync?SQLITE_SYNC_
16930 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59 4e 43  FULL:SQLITE_SYNC
16940 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66 28 20  _NORMAL);.  if( 
16950 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
16960 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
16970 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  c = 0;.}.#endif.
16980 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
16990 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
169a0 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e  able is incremen
169b0 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65  ted whenever the
169c0 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65   library.** atte
169d0 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74  mpts to open a t
169e0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20  emporary file.  
169f0 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
16a00 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20   is used for.** 
16a10 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
16a20 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a  ysis only.  .*/.
16a30 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
16a40 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  ST.int sqlite3_o
16a50 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20  pentemp_count = 
16a60 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
16a70 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   Open a temporar
16a80 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72  y file..**.** Wr
16a90 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ite the file des
16aa0 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46  criptor into *pF
16ab0 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ile. Return SQLI
16ac0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
16ad0 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68   .** or some oth
16ae0 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  er error code if
16af0 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53   we fail. The OS
16b00 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61   will automatica
16b10 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74  lly .** delete t
16b20 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
16b30 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  e when it is clo
16b40 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  sed..**.** The f
16b50 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 74  lags passed to t
16b60 68 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f 70  he VFS layer xOp
16b70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74 68  en() call are th
16b80 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  ose specified.**
16b90 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 76 66   by parameter vf
16ba0 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74 68  sFlags ORed with
16bb0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
16bc0 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  **.**     SQLITE
16bd0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a  _OPEN_READWRITE.
16be0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
16bf0 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20 20  EN_CREATE.**    
16c00 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
16c10 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53 51  LUSIVE.**     SQ
16c20 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
16c30 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69  ONCLOSE.*/.stati
16c40 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 74  c int pagerOpent
16c50 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50  emp(.  Pager *pP
16c60 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  ager,        /* 
16c70 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  The pager object
16c80 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
16c90 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57  le *pFile,  /* W
16ca0 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65  rite the file de
16cb0 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f  scriptor here */
16cc0 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  .  int vfsFlags 
16cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
16ce0 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
16cf0 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29   to the VFS */.)
16d00 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
16d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
16d20 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66  urn code */..#if
16d30 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
16d40 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65    sqlite3_opente
16d50 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20  mp_count++;  /* 
16d60 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  Used for testing
16d70 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
16d80 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ly */.#endif..  
16d90 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c  vfsFlags |=  SQL
16da0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
16db0 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
16dc0 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20  _CREATE |.      
16dd0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
16de0 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51  N_EXCLUSIVE | SQ
16df0 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
16e00 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20  ONCLOSE;.  rc = 
16e10 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50  sqlite3OsOpen(pP
16e20 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70  ager->pVfs, 0, p
16e30 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20  File, vfsFlags, 
16e40 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  0);.  assert( rc
16e50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
16e60 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a  sOpen(pFile) );.
16e70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16e80 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75  /*.** Set the bu
16e90 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy handler funct
16ea0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ion..**.** The p
16eb0 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68 65  ager invokes the
16ec0 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 66   busy-handler if
16ed0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29   sqlite3OsLock()
16ee0 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c   returns .** SQL
16ef0 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74 72  ITE_BUSY when tr
16f00 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20  ying to upgrade 
16f10 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20  from no-lock to 
16f20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a  a SHARED lock,.*
16f30 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e 67  * or when trying
16f40 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d   to upgrade from
16f50 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
16f60 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45   to an EXCLUSIVE
16f70 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f   .** lock. It do
16f80 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20  es *not* invoke 
16f90 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
16fa0 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
16fb0 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74  from.** SHARED t
16fc0 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20 77  o RESERVED, or w
16fd0 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72  hen upgrading fr
16fe0 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58 43  om SHARED to EXC
16ff0 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63 68  LUSIVE.** (which
17000 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 68   occurs during h
17010 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
17020 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a  ack). Summary:.*
17030 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69 6f  *.**   Transitio
17040 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
17050 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b           | Invok
17060 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72 0a  es xBusyHandler.
17070 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
17080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
170a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
170b0 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20     NO_LOCK      
170c0 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20   -> SHARED_LOCK 
170d0 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20       | Yes.**   
170e0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e  SHARED_LOCK   ->
170f0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20   RESERVED_LOCK  
17100 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52    | No.**   SHAR
17110 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43  ED_LOCK   -> EXC
17120 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20  LUSIVE_LOCK   | 
17130 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45 44  No.**   RESERVED
17140 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49  _LOCK -> EXCLUSI
17150 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a  VE_LOCK   | Yes.
17160 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75 73  **.** If the bus
17170 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y-handler callba
17180 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  ck returns non-z
17190 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73  ero, the lock is
171a0 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49 66   .** retried. If
171b0 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f   it returns zero
171c0 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49 54  , then the SQLIT
171d0 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73 0a  E_BUSY error is.
171e0 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  ** returned to t
171f0 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 65  he caller of the
17200 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74   pager API funct
17210 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
17220 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
17230 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65 72  handler(.  Pager
17240 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
17250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17260 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
17270 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  */.  int (*xBusy
17280 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a 29  Handler)(void *)
17290 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ,         /* Poi
172a0 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61 6e  nter to busy-han
172b0 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  dler function */
172c0 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61  .  void *pBusyHa
172d0 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20 20 20  ndlerArg        
172e0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
172f0 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78  ent to pass to x
17300 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29  BusyHandler */.)
17310 7b 20 20 0a 20 20 70 50 61 67 65 72 2d 3e 78 42  {  .  pPager->xB
17320 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75  usyHandler = xBu
17330 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61  syHandler;.  pPa
17340 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
17350 72 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64  rArg = pBusyHand
17360 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lerArg;.}../*.**
17370 20 53 65 74 20 74 68 65 20 72 65 69 6e 69 74 69   Set the reiniti
17380 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20  alizer for this 
17390 70 61 67 65 72 2e 20 49 66 20 6e 6f 74 20 4e 55  pager. If not NU
173a0 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61  LL, the reinitia
173b0 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c  lizer.** is call
173c0 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74  ed when the cont
173d0 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ent of a page in
173e0 20 63 61 63 68 65 20 69 73 20 6d 6f 64 69 66 69   cache is modifi
173f0 65 64 20 28 72 65 73 74 6f 72 65 64 29 0a 2a 2a  ed (restored).**
17400 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 74 72   as part of a tr
17410 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73 61 76  ansaction or sav
17420 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e  epoint rollback.
17430 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69   The callback gi
17440 76 65 73 20 0a 2a 2a 20 68 69 67 68 65 72 2d 6c  ves .** higher-l
17450 65 76 65 6c 20 63 6f 64 65 20 61 6e 20 6f 70 70  evel code an opp
17460 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65 73 74  ortunity to rest
17470 6f 72 65 20 74 68 65 20 45 58 54 52 41 20 73 65  ore the EXTRA se
17480 63 74 69 6f 6e 20 74 6f 20 0a 2a 2a 20 61 67 72  ction to .** agr
17490 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ee with the rest
174a0 6f 72 65 64 20 70 61 67 65 20 64 61 74 61 2e 0a  ored page data..
174b0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
174c0 61 67 65 72 53 65 74 52 65 69 6e 69 74 65 72 28  agerSetReiniter(
174d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76  Pager *pPager, v
174e0 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44  oid (*xReinit)(D
174f0 62 50 61 67 65 2a 29 29 7b 0a 20 20 70 50 61 67  bPage*)){.  pPag
17500 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20  er->xReiniter = 
17510 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  xReinit;.}../*.*
17520 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75 72  * Report the cur
17530 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61  rent page size a
17540 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  nd number of res
17550 65 72 76 65 64 20 62 79 74 65 73 20 62 61 63 6b  erved bytes back
17560 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63  .** to the codec
17570 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
17580 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61  TE_HAS_CODEC.sta
17590 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65  tic void pagerRe
175a0 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a  portSize(Pager *
175b0 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
175c0 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a  Pager->xCodecSiz
175d0 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61  eChng ){.    pPa
175e0 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43  ger->xCodecSizeC
175f0 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64  hng(pPager->pCod
17600 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ec, pPager->page
17610 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
17620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17630 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52   (int)pPager->nR
17640 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23  eserve);.  }.}.#
17650 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
17660 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29  gerReportSize(X)
17670 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66       /* No-op if
17680 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f   we do not suppo
17690 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65  rt a codec */.#e
176a0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  ndif../*.** Chan
176b0 67 65 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  ge the page size
176c0 20 75 73 65 64 20 62 79 20 74 68 65 20 50 61 67   used by the Pag
176d0 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e  er object. The n
176e0 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a  ew page size .**
176f0 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70   is passed in *p
17700 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  PageSize..**.** 
17710 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
17720 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
17730 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
17740 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
17750 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f   it.** is a no-o
17760 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  p. The value ret
17770 75 72 6e 65 64 20 69 73 20 74 68 65 20 65 72 72  urned is the err
17780 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63  or state error c
17790 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e  ode (i.e. .** on
177a0 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52  e of SQLITE_IOER
177b0 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  R, SQLITE_CORRUP
177c0 54 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  T or SQLITE_FULL
177d0 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
177e0 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  se, if all of th
177f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
17800 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  true:.**.**   * 
17810 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a  the new page siz
17820 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61  e (value of *pPa
17830 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64  geSize) is valid
17840 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20   (a power .**   
17850 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e    of two between
17860 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f   512 and SQLITE_
17870 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69  MAX_PAGE_SIZE, i
17880 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a  nclusive), and.*
17890 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61  *.**   * there a
178a0 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
178b0 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  g page reference
178c0 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a  s, and.**.**   *
178d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
178e0 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69   either not an i
178f0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
17900 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20  e or it is.**   
17910 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    an in-memory d
17920 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75 72  atabase that cur
17930 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20  rently consists 
17940 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a  of zero pages..*
17950 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61  *.** then the pa
17960 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20  ger object page 
17970 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a  size is set to *
17980 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
17990 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
179a0 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68  e is changed, th
179b0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
179c0 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61 67   uses sqlite3Pag
179d0 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74  erMalloc() .** t
179e0 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50  o obtain a new P
179f0 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62  ager.pTmpSpace b
17a00 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20 61  uffer. If this a
17a10 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70  llocation attemp
17a20 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  t .** fails, SQL
17a30 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
17a40 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61  urned and the pa
17a50 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20  ge size remains 
17a60 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49  unchanged. .** I
17a70 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65  n all other case
17a80 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  s, SQLITE_OK is 
17a90 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
17aa0 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  If the page size
17ab0 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c   is not changed,
17ac0 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
17ad0 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65  one of the enume
17ae0 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69  rated.** conditi
17af0 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74  ons above is not
17b00 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65 72   true, the pager
17b10 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74   was in error st
17b20 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a  ate when this.**
17b30 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
17b40 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65  lled, or because
17b50 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
17b60 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66  cation attempt f
17b70 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20  ailed, .** then 
17b80 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73 65  *pPageSize is se
17b90 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65  t to the old, re
17ba0 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  tained page size
17bb0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
17bc0 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
17bd0 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
17be0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
17bf0 20 75 31 36 20 2a 70 50 61 67 65 53 69 7a 65 2c   u16 *pPageSize,
17c00 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a   int nReserve){.
17c10 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65    int rc = pPage
17c20 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69 66  r->errCode;.  if
17c30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17c40 29 7b 0a 20 20 20 20 75 31 36 20 70 61 67 65 53  ){.    u16 pageS
17c50 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65  ize = *pPageSize
17c60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61  ;.    assert( pa
17c70 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61  geSize==0 || (pa
17c80 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
17c90 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
17ca0 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29  MAX_PAGE_SIZE) )
17cb0 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 53 69  ;.    if( pageSi
17cc0 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d  ze && pageSize!=
17cd0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
17ce0 20 0a 20 20 20 20 20 26 26 20 28 70 50 61 67 65   .     && (pPage
17cf0 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70  r->memDb==0 || p
17d00 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30  Pager->dbSize==0
17d10 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  ).     && sqlite
17d20 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
17d30 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
17d40 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  ==0 .    ){.    
17d50 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 28    char *pNew = (
17d60 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61  char *)sqlite3Pa
17d70 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a  geMalloc(pageSiz
17d80 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  e);.      if( !p
17d90 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72  New ){.        r
17da0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
17db0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
17dc0 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
17dd0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
17de0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
17df0 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
17e00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17e10 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d  PageFree(pPager-
17e20 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20  >pTmpSpace);.   
17e30 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d       pPager->pTm
17e40 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20  pSpace = pNew;. 
17e50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63         sqlite3Pc
17e60 61 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28  acheSetPageSize(
17e70 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
17e80 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20   pageSize);.    
17e90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70    }.    }.    *p
17ea0 50 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29  PageSize = (u16)
17eb0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
17ec0 3b 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65 72  ;.    if( nReser
17ed0 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20  ve<0 ) nReserve 
17ee0 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72  = pPager->nReser
17ef0 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ve;.    assert( 
17f00 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e  nReserve>=0 && n
17f10 52 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a  Reserve<1000 );.
17f20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73      pPager->nRes
17f30 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73  erve = (i16)nRes
17f40 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52  erve;.    pagerR
17f50 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72  eportSize(pPager
17f60 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
17f70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
17f80 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
17f90 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20   the "temporary 
17fa0 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c  page" buffer hel
17fb0 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  d internally.** 
17fc0 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54  by the pager.  T
17fd0 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20  his is a buffer 
17fe0 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75  that is big enou
17ff0 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a  gh to hold the.*
18000 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  * entire content
18010 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70   of a database p
18020 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65  age.  This buffe
18030 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e  r is used intern
18040 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72  ally.** during r
18050 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c  ollback and will
18060 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
18070 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62  whenever a rollb
18080 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20  ack.** occurs.  
18090 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65  But other module
180a0 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73  s are free to us
180b0 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e  e it too, as lon
180c0 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62  g as.** no rollb
180d0 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69  acks are happeni
180e0 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ng..*/.void *sql
180f0 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
18100 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ce(Pager *pPager
18110 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
18120 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d  er->pTmpSpace;.}
18130 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
18140 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d  to set the maxim
18150 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65  um database page
18160 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65   count if mxPage
18170 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a   is positive. .*
18180 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  * Make no change
18190 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a  s if mxPage is z
181a0 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  ero or negative.
181b0 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75    And never redu
181c0 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75  ce the.** maximu
181d0 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c  m page count bel
181e0 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ow the current s
181f0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
18200 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72  ase..**.** Regar
18210 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c  dless of mxPage,
18220 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   return the curr
18230 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  ent maximum page
18240 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
18250 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
18260 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  geCount(Pager *p
18270 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
18280 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65  e){.  if( mxPage
18290 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  >0 ){.    pPager
182a0 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67  ->mxPgno = mxPag
182b0 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  e;.  }.  sqlite3
182c0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
182d0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 72 65 74  Pager, 0);.  ret
182e0 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  urn pPager->mxPg
182f0 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  no;.}../*.** The
18300 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f   following set o
18310 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  f routines are u
18320 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  sed to disable t
18330 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  he simulated.** 
18340 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e  I/O error mechan
18350 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74  ism.  These rout
18360 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
18370 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64   avoid simulated
18380 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c  .** errors in pl
18390 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f  aces where we do
183a0 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
183b0 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e  errors..**.** Un
183c0 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45  less -DSQLITE_TE
183d0 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68  ST=1 is used, th
183e0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
183f0 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61   all no-ops.** a
18400 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63  nd generate no c
18410 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ode..*/.#ifdef S
18420 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72  QLITE_TEST.exter
18430 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
18440 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
18450 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
18460 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b  e3_io_error_hit;
18470 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
18480 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61  d_cnt;.void disa
18490 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
184a0 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
184b0 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c   saved_cnt = sql
184c0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
184d0 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33  nding;.  sqlite3
184e0 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
184f0 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65  g = -1;.}.void e
18500 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
18510 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
18520 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
18530 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61  ror_pending = sa
18540 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65  ved_cnt;.}.#else
18550 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c  .# define disabl
18560 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
18570 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65  rrors().# define
18580 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
18590 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65  d_io_errors().#e
185a0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
185b0 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74   the first N byt
185c0 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  es from the begi
185d0 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c  nning of the fil
185e0 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a  e into memory.**
185f0 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e   that pDest poin
18600 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ts to. .**.** If
18610 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 6f   the pager was o
18620 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e 73  pened on a trans
18630 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c 65  ient file (zFile
18640 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a  name==""), or.**
18650 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c   opened on a fil
18660 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62 79  e less than N by
18670 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65  tes in size, the
18680 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
18690 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20  s.** zeroed and 
186a0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
186b0 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c  ed. The rational
186c0 65 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68  e for this is th
186d0 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  at this .** func
186e0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
186f0 72 65 61 64 20 64 61 74 61 62 61 73 65 20 68 65  read database he
18700 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77  aders, and a new
18710 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a   transient or.**
18720 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61   zero sized data
18730 62 61 73 65 20 68 61 73 20 61 20 68 65 61 64 65  base has a heade
18740 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20  r than consists 
18750 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f  entirely of zero
18760 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  es..**.** If any
18770 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74 20   IO error apart 
18780 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52  from SQLITE_IOER
18790 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73 20  R_SHORT_READ is 
187a0 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20  encountered,.** 
187b0 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
187c0 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
187d0 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68 65  e caller and the
187e0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
187f0 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65  .** output buffe
18800 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  r undefined..*/.
18810 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
18820 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 50  ReadFileheader(P
18830 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
18840 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  t N, unsigned ch
18850 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e  ar *pDest){.  in
18860 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
18870 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74  ;.  memset(pDest
18880 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72  , 0, N);.  asser
18890 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
188a0 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
188b0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 69  >tempFile );.  i
188c0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
188d0 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54  ->fd) ){.    IOT
188e0 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20  RACE(("DBHDR %p 
188f0 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  0 %d\n", pPager,
18900 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71   N)).    rc = sq
18910 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
18920 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e  er->fd, pDest, N
18930 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
18940 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
18950 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
18960 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
18970 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
18980 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
18990 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f  ** Return the to
189a0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
189b0 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
189c0 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61  ase file associa
189d0 74 65 64 20 0a 2a 2a 20 77 69 74 68 20 70 50 61  ted .** with pPa
189e0 67 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74  ger. Normally, t
189f0 68 69 73 20 69 73 20 63 61 6c 63 75 6c 61 74 65  his is calculate
18a00 64 20 61 73 20 28 3c 64 62 20 66 69 6c 65 20 73  d as (<db file s
18a10 69 7a 65 3e 2f 3c 70 61 67 65 2d 73 69 7a 65 3e  ize>/<page-size>
18a20 29 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69  )..** However, i
18a30 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 62 65  f the file is be
18a40 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70 61 67  tween 1 and <pag
18a50 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20 69 6e  e-size> bytes in
18a60 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20   size, then .** 
18a70 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64 65 72  this is consider
18a80 65 64 20 61 20 31 20 70 61 67 65 20 66 69 6c 65  ed a 1 page file
18a90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
18aa0 61 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f 72  ager is in error
18ab0 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
18ac0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
18ad0 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  led, then the.**
18ae0 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72   error state err
18af0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
18b00 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20  ned and *pnPage 
18b10 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 20  left unchanged. 
18b20 4f 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 66 69  Or,.** if the fi
18b30 6c 65 20 73 79 73 74 65 6d 20 68 61 73 20 74 6f  le system has to
18b40 20 62 65 20 71 75 65 72 69 65 64 20 66 6f 72 20   be queried for 
18b50 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
18b60 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20  file and.** the 
18b70 71 75 65 72 79 20 61 74 74 65 6d 70 74 20 72 65  query attempt re
18b80 74 75 72 6e 73 20 61 6e 20 49 4f 20 65 72 72 6f  turns an IO erro
18b90 72 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  r, the IO error 
18ba0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
18bb0 0a 2a 2a 20 61 6e 64 20 2a 70 6e 50 61 67 65 20  .** and *pnPage 
18bc0 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  is left unchange
18bd0 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  d..**.** Otherwi
18be0 73 65 2c 20 69 66 20 65 76 65 72 79 74 68 69 6e  se, if everythin
18bf0 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
18c00 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   then SQLITE_OK 
18c10 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
18c20 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 73 65  nd *pnPage is se
18c30 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
18c40 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
18c50 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74  database..*/.int
18c60 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
18c70 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
18c80 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67  ager, int *pnPag
18c90 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65  e){.  Pgno nPage
18ca0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18cb0 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
18cc0 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a  rn via *pnPage *
18cd0 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  /..  /* If the p
18ce0 61 67 65 72 20 69 73 20 61 6c 72 65 61 64 79 20  ager is already 
18cf0 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
18d00 74 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65  te, return the e
18d10 72 72 6f 72 20 63 6f 64 65 2e 20 2a 2f 0a 20 20  rror code. */.  
18d20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
18d30 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ode ){.    retur
18d40 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
18d50 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74  e;.  }..  /* Det
18d60 65 72 6d 69 6e 65 20 74 68 65 20 6e 75 6d 62 65  ermine the numbe
18d70 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
18d80 65 20 66 69 6c 65 2e 20 53 74 6f 72 65 20 74 68  e file. Store th
18d90 69 73 20 69 6e 20 6e 50 61 67 65 2e 20 2a 2f 0a  is in nPage. */.
18da0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
18db0 53 69 7a 65 56 61 6c 69 64 20 29 7b 0a 20 20 20  SizeValid ){.   
18dc0 20 6e 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d   nPage = pPager-
18dd0 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65  >dbSize;.  }else
18de0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20  {.    int rc;   
18df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18e00 20 45 72 72 6f 72 20 72 65 74 75 72 6e 65 64 20   Error returned 
18e10 62 79 20 4f 73 46 69 6c 65 53 69 7a 65 28 29 20  by OsFileSize() 
18e20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30  */.    i64 n = 0
18e30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
18e40 2a 20 46 69 6c 65 20 73 69 7a 65 20 69 6e 20 62  * File size in b
18e50 79 74 65 73 20 72 65 74 75 72 6e 65 64 20 62 79  ytes returned by
18e60 20 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f   OsFileSize() */
18e70 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ..    assert( is
18e80 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
18e90 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
18ea0 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20  File );.    if( 
18eb0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
18ec0 64 29 20 26 26 20 28 30 20 21 3d 20 28 72 63 20  d) && (0 != (rc 
18ed0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
18ee0 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
18ef0 26 6e 29 29 29 20 29 7b 0a 20 20 20 20 20 20 70  &n))) ){.      p
18f00 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
18f10 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 72 65  r, rc);.      re
18f20 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
18f30 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c     if( n>0 && n<
18f40 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
18f50 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
18f60 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
18f70 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50        nPage = (P
18f80 67 6e 6f 29 28 6e 20 2f 20 70 50 61 67 65 72 2d  gno)(n / pPager-
18f90 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
18fa0 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
18fb0 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
18fc0 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70  NLOCK ){.      p
18fd0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
18fe0 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 70 50 61  nPage;.      pPa
18ff0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
19000 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 70  = nPage;.      p
19010 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
19020 69 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  id = 1;.    }.  
19030 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  }..  /* If the c
19040 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66  urrent number of
19050 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69   pages in the fi
19060 6c 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68  le is greater th
19070 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f 6e  an the .  ** con
19080 66 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20  figured maximum 
19090 70 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e  pager number, in
190a0 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77  crease the allow
190b0 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a  ed limit so.  **
190c0 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 63   that the file c
190d0 61 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f  an be read..  */
190e0 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61  .  if( nPage>pPa
190f0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
19100 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
19110 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b  o = (Pgno)nPage;
19120 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
19130 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  he output variab
19140 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  le and return SQ
19150 4c 49 54 45 5f 4f 4b 20 2a 2f 0a 20 20 69 66 28  LITE_OK */.  if(
19160 20 70 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 2a   pnPage ){.    *
19170 70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  pnPage = nPage;.
19180 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
19190 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
191a0 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
191b0 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c  a lock of type l
191c0 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64  ocktype on the d
191d0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
191e0 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72  .** a similar or
191f0 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73   greater lock is
19200 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74   already held, t
19210 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
19220 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75  a no-op.** (retu
19230 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20  rning SQLITE_OK 
19240 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a  immediately)..**
19250 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
19260 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e  ttempt to obtain
19270 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
19280 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e  sqlite3OsLock().
19290 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20   Invoke .** the 
192a0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
192b0 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72   the lock is cur
192c0 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c  rently not avail
192d0 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a  able. Repeat .**
192e0 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20   until the busy 
192f0 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
19300 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20   false or until 
19310 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a  the attempt to .
19320 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  ** obtain the lo
19330 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a  ck succeeds..**.
19340 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
19350 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61  _OK on success a
19360 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
19370 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62   if we cannot ob
19380 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  tain.** the lock
19390 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  . If the lock is
193a0 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73   obtained succes
193b0 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20  sfully, set the 
193c0 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20  Pager.state .** 
193d0 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  variable to lock
193e0 74 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75  type before retu
193f0 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
19400 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f   int pager_wait_
19410 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  on_lock(Pager *p
19420 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74  Pager, int lockt
19430 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ype){.  int rc; 
19440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19450 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19460 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
19470 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b    /* The OS lock
19480 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20   values must be 
19490 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
194a0 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65  Pager lock value
194b0 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 50  s */.  assert( P
194c0 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41  AGER_SHARED==SHA
194d0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
194e0 73 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45  sert( PAGER_RESE
194f0 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c  RVED==RESERVED_L
19500 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
19510 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
19520 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
19530 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
19540 20 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74   file is current
19550 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e  ly unlocked then
19560 20 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20 62   the size must b
19570 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61  e unknown */.  a
19580 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
19590 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
195a0 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  ED || pPager->db
195b0 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a  SizeValid==0 );.
195c0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
195d0 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20   this is either 
195e0 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65  a no-op (because
195f0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
19600 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72  ock is .  ** alr
19610 65 61 64 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e  eady held, or on
19620 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 73  e of the transis
19630 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62  tions that the b
19640 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a  usy-handler.  **
19650 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20   may be invoked 
19660 64 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e  during, accordin
19670 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74  g to the comment
19680 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69   above.  ** sqli
19690 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
196a0 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20  andler()..  */. 
196b0 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
196c0 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70  ->state>=locktyp
196d0 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50  e).       || (pP
196e0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
196f0 45 52 5f 55 4e 4c 4f 43 4b 20 26 26 20 6c 6f 63  ER_UNLOCK && loc
19700 6b 74 79 70 65 3d 3d 50 41 47 45 52 5f 53 48 41  ktype==PAGER_SHA
19710 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  RED).       || (
19720 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
19730 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 26 26  AGER_RESERVED &&
19740 20 6c 6f 63 6b 74 79 70 65 3d 3d 50 41 47 45 52   locktype==PAGER
19750 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 29 3b  _EXCLUSIVE).  );
19760 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
19770 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20  state>=locktype 
19780 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
19790 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
197a0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72      do {.      r
197b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
197c0 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f  k(pPager->fd, lo
197d0 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68  cktype);.    }wh
197e0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
197f0 42 55 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e  BUSY && pPager->
19800 78 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61  xBusyHandler(pPa
19810 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
19820 72 41 72 67 29 20 29 3b 0a 20 20 20 20 69 66 28  rArg) );.    if(
19830 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19840 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
19850 73 74 61 74 65 20 3d 20 28 75 38 29 6c 6f 63 6b  state = (u8)lock
19860 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f 54 52  type;.      IOTR
19870 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64  ACE(("LOCK %p %d
19880 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63  \n", pPager, loc
19890 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a 20 20  ktype)).    }.  
198a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
198b0 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
198c0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   the in-memory d
198d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61  atabase file ima
198e0 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65  ge to nPage page
198f0 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  s. This .** func
19900 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63  tion does not ac
19910 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68  tually modify th
19920 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
19930 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20  on disk. It .** 
19940 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69 6e  just sets the in
19950 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20  ternal state of 
19960 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
19970 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a   so that the .**
19980 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c   truncation will
19990 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68   be done when th
199a0 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
199b0 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
199c0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
199d0 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
199e0 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  Image(Pager *pPa
199f0 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
19a00 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
19a10 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
19a20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
19a30 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61  ger->dbSize>=nPa
19a40 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
19a50 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
19a60 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
19a70 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
19a80 65 20 3d 20 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a  e = nPage;.}../*
19a90 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
19aa0 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72   page cache.  Fr
19ab0 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e  ee all memory an
19ac0 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65  d close all file
19ad0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72  s..**.** If a tr
19ae0 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e  ansaction was in
19af0 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74   progress when t
19b00 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
19b10 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74  alled, that.** t
19b20 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
19b30 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20  lled back.  All 
19b40 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
19b50 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
19b60 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d  d.** and their m
19b70 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20  emory is freed. 
19b80 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
19b90 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63  use a page assoc
19ba0 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
19bb0 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66  is page cache af
19bc0 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
19bd0 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c  n returns will l
19be0 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20  ikely.** result 
19bf0 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
19c00 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
19c10 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  on always succee
19c20 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  ds. If a transac
19c30 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
19c40 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20  n attempt.** is 
19c50 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20  made to roll it 
19c60 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f  back. If an erro
19c70 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
19c80 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a  the rollback .**
19c90 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d   a hot journal m
19ca0 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68  ay be left in th
19cb0 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74  e filesystem but
19cc0 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74   no error is ret
19cd0 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  urned.** to the 
19ce0 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  caller..*/.int s
19cf0 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
19d00 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
19d10 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  .  disable_simul
19d20 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
19d30 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
19d40 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
19d50 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
19d60 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
19d70 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
19d80 20 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73 65   0;.  pager_rese
19d90 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
19da0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 61   MEMDB ){.    pa
19db0 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
19dc0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
19dd0 20 2f 2a 20 53 65 74 20 50 61 67 65 72 2e 6a 6f   /* Set Pager.jo
19de0 75 72 6e 61 6c 48 64 72 20 74 6f 20 2d 31 20 66  urnalHdr to -1 f
19df0 6f 72 20 74 68 65 20 62 65 6e 65 66 69 74 20 6f  or the benefit o
19e00 66 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79  f the pager_play
19e10 62 61 63 6b 28 29 20 0a 20 20 20 20 2a 2a 20 63  back() .    ** c
19e20 61 6c 6c 20 77 68 69 63 68 20 6d 61 79 20 62 65  all which may be
19e30 20 6d 61 64 65 20 66 72 6f 6d 20 77 69 74 68 69   made from withi
19e40 6e 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64  n pagerUnlockAnd
19e50 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 49 66 20 69  Rollback(). If i
19e60 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  t.    ** is not 
19e70 2d 31 2c 20 74 68 65 6e 20 74 68 65 20 75 6e 73  -1, then the uns
19e80 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66  ynced portion of
19e90 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c   an open journal
19ea0 20 66 69 6c 65 20 6d 61 79 0a 20 20 20 20 2a 2a   file may.    **
19eb0 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
19ec0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
19ed0 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  e. If a power fa
19ee0 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69  ilure occurs whi
19ef0 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69  le.    ** this i
19f00 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68 65  s happening, the
19f10 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65   database may be
19f20 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20 20  come corrupt..  
19f30 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
19f40 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 2d 31  >journalHdr = -1
19f50 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  ;.    pagerUnloc
19f60 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
19f70 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
19f80 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
19f90 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73  oc();.  enable_s
19fa0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
19fb0 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41  rs();.  PAGERTRA
19fc0 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE(("CLOSE %d\n"
19fd0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
19fe0 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  )));.  IOTRACE((
19ff0 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50  "CLOSE %p\n", pP
1a000 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33  ager)).  sqlite3
1a010 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
1a020 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  fd);.  sqlite3Pa
1a030 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  geFree(pPager->p
1a040 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 73 71 6c  TmpSpace);.  sql
1a050 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28  ite3PcacheClose(
1a060 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
1a070 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
1a080 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28  _HAS_CODEC.  if(
1a090 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46   pPager->xCodecF
1a0a0 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43  ree ) pPager->xC
1a0b0 6f 64 65 63 46 72 65 65 28 70 50 61 67 65 72 2d  odecFree(pPager-
1a0c0 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66  >pCodec);.#endif
1a0d0 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
1a0e0 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20  ger->aSavepoint 
1a0f0 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a  && !pPager->pInJ
1a100 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
1a110 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  rt( !isOpen(pPag
1a120 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f  er->jfd) && !isO
1a130 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
1a140 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ) );..  sqlite3_
1a150 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  free(pPager);.  
1a160 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a170 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
1a180 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66  d(NDEBUG) || def
1a190 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
1a1a0 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
1a1b0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
1a1c0 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
1a1d0 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65  Pgno sqlite3Page
1a1e0 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61  rPagenumber(DbPa
1a1f0 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
1a200 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a  rn pPg->pgno;.}.
1a210 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
1a220 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
1a230 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
1a240 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69  page pPg..*/.voi
1a250 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  d sqlite3PagerRe
1a260 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
1a270 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
1a280 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ef(pPg);.}../*.*
1a290 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
1a2a0 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  al. In other wor
1a2b0 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  ds, make sure al
1a2c0 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74  l the pages that
1a2d0 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72   have.** been wr
1a2e0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
1a2f0 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c  rnal have actual
1a300 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73  ly reached the s
1a310 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a  urface of the.**
1a320 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 65   disk and can be
1a330 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68 65   restored in the
1a340 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d   event of a hot-
1a350 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
1a360 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
1a370 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  ager.needSync fl
1a380 61 67 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 74  ag is not set, t
1a390 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1a3a0 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e  n is a.** no-op.
1a3b0 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
1a3c0 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64  actions required
1a3d0 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a   depend on the j
1a3e0 6f 75 72 6e 61 6c 2d 6d 6f 64 65 0a 2a 2a 20 61  ournal-mode.** a
1a3f0 6e 64 20 74 68 65 20 64 65 76 69 63 65 20 63 68  nd the device ch
1a400 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f 66  aracteristics of
1a410 20 74 68 65 20 74 68 65 20 66 69 6c 65 2d 73 79   the the file-sy
1a420 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  stem, as follows
1a430 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74  :.**.**   * If t
1a440 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1a450 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
1a460 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f  journal file, no
1a470 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20   action need.** 
1a480 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a      be taken..**
1a490 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73  .**   * Otherwis
1a4a0 65 2c 20 69 66 20 74 68 65 20 64 65 76 69 63 65  e, if the device
1a4b0 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
1a4c0 74 20 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e  t the SAFE_APPEN
1a4d0 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20  D property,.**  
1a4e0 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63     then the nRec
1a4f0 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f   field of the mo
1a500 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74  st recently writ
1a510 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ten journal head
1a520 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64  er.**     is upd
1a530 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ated to contain 
1a540 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f  the number of jo
1a550 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68  urnal records th
1a560 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62  at have.**     b
1a570 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c  een written foll
1a580 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65  owing it. If the
1a590 20 70 61 67 65 72 20 69 73 20 6f 70 65 72 61 74   pager is operat
1a5a0 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63  ing in full-sync
1a5b0 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68  .**     mode, th
1a5c0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
1a5d0 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62 65  ile is synced be
1a5e0 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64 20  fore this field 
1a5f0 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a  is updated..**.*
1a600 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64 65 76  *   * If the dev
1a610 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ice does not sup
1a620 70 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e 54  port the SEQUENT
1a630 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68  IAL property, th
1a640 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  en .**     journ
1a650 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  al file is synce
1a660 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20  d..**.** Or, in 
1a670 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a  pseudo-code:.**.
1a680 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e  **   if( NOT <in
1a690 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e  -memory journal>
1a6a0 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e   ){.**     if( N
1a6b0 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29  OT SAFE_APPEND )
1a6c0 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c  {.**       if( <
1a6d0 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20  full-sync mode> 
1a6e0 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c  ) xSync(<journal
1a6f0 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20   file>);.**     
1a700 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66    <update nRec f
1a710 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a  ield>.**     } .
1a720 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53  **     if( NOT S
1a730 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e  EQUENTIAL ) xSyn
1a740 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e  c(<journal file>
1a750 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20  );.**   }.**.** 
1a760 54 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79  The Pager.needSy
1a770 6e 63 20 66 6c 61 67 20 69 73 20 6e 65 76 65 72  nc flag is never
1a780 20 62 65 20 73 65 74 20 66 6f 72 20 74 65 6d 70   be set for temp
1a790 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 6f 72 20  orary files, or 
1a7a0 61 6e 79 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 72  any.** file oper
1a7b0 61 74 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63  ating in no-sync
1a7c0 20 6d 6f 64 65 20 28 50 61 67 65 72 2e 6e 6f 53   mode (Pager.noS
1a7d0 79 6e 63 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a  ync set to non-z
1a7e0 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ero)..**.** If s
1a7f0 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20  uccessful, this 
1a800 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74  routine clears t
1a810 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
1a820 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79  NC flag of every
1a830 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e   .** page curren
1a840 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f  tly held in memo
1a850 72 79 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ry before return
1a860 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  ing SQLITE_OK. I
1a870 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72  f an IO.** error
1a880 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
1a890 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
1a8a0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1a8b0 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
1a8c0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1a8d0 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67   syncJournal(Pag
1a8e0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1a8f0 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  f( pPager->needS
1a900 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ync ){.    asser
1a910 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
1a920 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20  File );.    if( 
1a930 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
1a940 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
1a950 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b  ALMODE_MEMORY ){
1a960 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 20 20  .      int rc;  
1a970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1a990 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1a9a0 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44      const int iD
1a9b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
1a9c0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1a9d0 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
1a9e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
1a9f0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
1aa00 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  ) );..      if( 
1aa10 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
1aa20 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
1aa30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
1aa40 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73  This block deals
1aa50 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65   with an obscure
1aa60 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65   problem. If the
1aa70 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e   last connection
1aa80 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
1aa90 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64   wrote to this d
1aaa0 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65 72  atabase was oper
1aab0 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74  ating in persist
1aac0 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  ent-journal.    
1aad0 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65      ** mode, the
1aae0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
1aaf0 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20 70  le may at this p
1ab00 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65  oint actually be
1ab10 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20 20   larger.        
1ab20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f  ** than Pager.jo
1ab30 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20  urnalOff bytes. 
1ab40 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e  If the next thin
1ab50 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g in the journal
1ab60 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  .        ** file
1ab70 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61   happens to be a
1ab80 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
1ab90 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72 74  (written as part
1aba0 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
1abb0 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e  ** previous conn
1abc0 65 63 74 69 6f 6e 73 20 74 72 61 6e 73 61 63 74  ections transact
1abd0 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73  ion), and a cras
1abe0 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75  h or power-failu
1abf0 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  re .        ** o
1ac00 63 63 75 72 73 20 61 66 74 65 72 20 6e 52 65 63  ccurs after nRec
1ac10 20 69 73 20 75 70 64 61 74 65 64 20 62 75 74 20   is updated but 
1ac20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e  before this conn
1ac30 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20  ection writes . 
1ac40 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69         ** anythi
1ac50 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a  ng else to the j
1ac60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20  ournal file (or 
1ac70 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61  commits/rolls ba
1ac80 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20 20  ck its .        
1ac90 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  ** transaction),
1aca0 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79   then SQLite may
1acb0 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64   become confused
1acc0 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20   when doing the 
1acd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d  .        ** hot-
1ace0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
1acf0 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76   following recov
1ad00 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c  ery. It may roll
1ad10 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20   back all.      
1ad20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e    ** of this con
1ad30 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74  nections data, t
1ad40 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72  hen proceed to r
1ad50 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20  olling back the 
1ad60 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  old,.        ** 
1ad70 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61  out-of-date data
1ad80 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74   that follows it
1ad90 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75  . Database corru
1ada0 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  ption..        *
1adb0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20  *.        ** To 
1adc0 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
1add0 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  , if the journal
1ade0 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61   file does appea
1adf0 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20  r to contain.   
1ae00 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20       ** a valid 
1ae10 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67  header following
1ae20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
1ae30 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20  f, then write a 
1ae40 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20  0x00.        ** 
1ae50 62 79 74 65 20 74 6f 20 74 68 65 20 73 74 61 72  byte to the star
1ae60 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65  t of it to preve
1ae70 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67  nt it from being
1ae80 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20   recognized..   
1ae90 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
1aea0 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78  ** Variable iNex
1aeb0 74 48 64 72 4f 66 66 73 65 74 20 69 73 20 73 65  tHdrOffset is se
1aec0 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  t to the offset 
1aed0 61 74 20 77 68 69 63 68 20 74 68 69 73 0a 20 20  at which this.  
1aee0 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d        ** problem
1aef0 61 74 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c  atic header will
1af00 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65 78   occur, if it ex
1af10 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20  ists. aMagic is 
1af20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a  used .        **
1af30 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   as a temporary 
1af40 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63  buffer to inspec
1af50 74 20 74 68 65 20 66 69 72 73 74 20 63 6f 75 70  t the first coup
1af60 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20  le of bytes of. 
1af70 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f         ** the po
1af80 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20  tential journal 
1af90 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20  header..        
1afa0 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  */.        i64 i
1afb0 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b 0a 20  NextHdrOffset;. 
1afc0 20 20 20 20 20 20 20 75 38 20 61 4d 61 67 69 63         u8 aMagic
1afd0 5b 38 5d 3b 0a 09 75 38 20 7a 48 65 61 64 65 72  [8];..u8 zHeader
1afe0 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
1aff0 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 09 6d 65 6d  Magic)+4];...mem
1b000 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
1b010 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
1b020 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
1b030 29 29 3b 0a 09 70 75 74 33 32 62 69 74 73 28 26  ));..put32bits(&
1b040 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
1b050 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
1b060 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a  pPager->nRec);..
1b070 20 20 20 20 20 20 20 20 69 4e 65 78 74 48 64 72          iNextHdr
1b080 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c  Offset = journal
1b090 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72  HdrOffset(pPager
1b0a0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1b0b0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
1b0c0 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
1b0d0 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72 4f 66  c, 8, iNextHdrOf
1b0e0 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69  fset);.        i
1b0f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b100 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d   && 0==memcmp(aM
1b110 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
1b120 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20  gic, 8) ){.     
1b130 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
1b140 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20  t u8 zerobyte = 
1b150 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
1b160 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1b170 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a  (pPager->jfd, &z
1b180 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65 78  erobyte, 1, iNex
1b190 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20  tHdrOffset);.   
1b1a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1b1b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b1c0 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49   && rc!=SQLITE_I
1b1d0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
1b1e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
1b1f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1b200 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72  }..        /* Wr
1b210 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  ite the nRec val
1b220 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ue into the jour
1b230 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e  nal file header.
1b240 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a   If in.        *
1b250 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f  * full-synchrono
1b260 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68  us mode, sync th
1b270 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e  e journal first.
1b280 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
1b290 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  at.        ** al
1b2a0 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c  l data has reall
1b2b0 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62  y hit the disk b
1b2c0 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70  efore nRec is up
1b2d0 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20  dated to mark.  
1b2e0 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61        ** it as a
1b2f0 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72   candidate for r
1b300 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ollback..       
1b310 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
1b320 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
1b330 72 65 64 20 69 66 20 74 68 65 20 70 65 72 73 69  red if the persi
1b340 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70  stent media supp
1b350 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20 20 20  orts the.       
1b360 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20   ** SAFE_APPEND 
1b370 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73  property. Becaus
1b380 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69  e in this case i
1b390 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
1b3a0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  e .        ** fo
1b3b0 72 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  r garbage data t
1b3c0 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f  o be appended to
1b3d0 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e   the file, the n
1b3e0 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20  Rec field.      
1b3f0 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65    ** is populate
1b400 64 20 77 69 74 68 20 30 78 46 46 46 46 46 46 46  d with 0xFFFFFFF
1b410 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  F when the journ
1b420 61 6c 20 68 65 61 64 65 72 20 69 73 20 77 72 69  al header is wri
1b430 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tten.        ** 
1b440 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20  and never needs 
1b450 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20  to be updated.. 
1b460 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1b470 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
1b480 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44  llSync && 0==(iD
1b490 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
1b4a0 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
1b4b0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1b4c0 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
1b4d0 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
1b4e0 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
1b4f0 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45           IOTRACE
1b500 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20  (("JSYNC %p\n", 
1b510 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20  pPager)).       
1b520 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1b530 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
1b540 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
1b550 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20  flags);.        
1b560 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b570 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1b580 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b590 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
1b5a0 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50  R %p %lld\n", pP
1b5b0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
1b5c0 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20 20  urnalHdr));.    
1b5d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b5e0 4f 73 57 72 69 74 65 28 0a 20 20 20 20 20 20 20  OsWrite(.       
1b5f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64       pPager->jfd
1b600 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  , zHeader, sizeo
1b610 66 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61 67  f(zHeader), pPag
1b620 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 09  er->journalHdr..
1b630 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1b640 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1b650 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1b660 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  }.      if( 0==(
1b670 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
1b680 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
1b690 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1b6a0 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
1b6b0 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
1b6c0 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
1b6d0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
1b6e0 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
1b6f0 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72  ager)).        r
1b700 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
1b710 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
1b720 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
1b730 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70  s| .          (p
1b740 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
1b750 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  s==SQLITE_SYNC_F
1b760 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ULL?SQLITE_SYNC_
1b770 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20  DATAONLY:0).    
1b780 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1b790 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b7a0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1b7b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1b7c0 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   /* The journal 
1b7d0 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 73 75  file was just su
1b7e0 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65  ccessfully synce
1b7f0 64 2e 20 53 65 74 20 50 61 67 65 72 2e 6e 65 65  d. Set Pager.nee
1b800 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 74 6f  dSync .    ** to
1b810 20 7a 65 72 6f 20 61 6e 64 20 63 6c 65 61 72 20   zero and clear 
1b820 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
1b830 59 4e 43 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 20  YNC flag on all 
1b840 70 61 67 65 73 73 2e 0a 20 20 20 20 2a 2f 0a 20  pagess..    */. 
1b850 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
1b860 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ync = 0;.    pPa
1b870 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
1b880 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c  ted = 1;.    sql
1b890 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 53  ite3PcacheClearS
1b8a0 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d  yncFlags(pPager-
1b8b0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a  >pPCache);.  }..
1b8c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b8d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
1b8e0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
1b8f0 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b   first in a link
1b900 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79  ed list of dirty
1b910 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64   pages connected
1b920 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72  .** by the PgHdr
1b930 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e  .pDirty pointer.
1b940 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
1b950 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f  rites each one o
1b960 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  f the.** in-memo
1b970 72 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ry pages in the 
1b980 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61  list to the data
1b990 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61  base file. The a
1b9a0 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62  rgument may.** b
1b9b0 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e  e NULL, represen
1b9c0 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69  ting an empty li
1b9d0 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  st. In this case
1b9e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1b9f0 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s.** a no-op..**
1ba00 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75  .** The pager mu
1ba10 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  st hold at least
1ba20 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
1ba30 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
1ba40 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ion.** is called
1ba50 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67  . Before writing
1ba60 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65   anything to the
1ba70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
1ba80 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20  this lock.** is 
1ba90 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45  upgraded to an E
1baa0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
1bab0 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f  f the lock canno
1bac0 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a  t be obtained,.*
1bad0 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
1bae0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f   returned and no
1baf0 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
1bb00 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1bb10 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66   file..** .** If
1bb20 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20   the pager is a 
1bb30 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20  temp-file pager 
1bb40 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66  and the actual f
1bb50 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a  ile-system file.
1bb60 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70  ** is not yet op
1bb70 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65  en, it is create
1bb80 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66  d and opened bef
1bb90 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
1bba0 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e  .** written out.
1bbb0 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20  .**.** Once the 
1bbc0 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70  lock has been up
1bbd0 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e  graded and, if n
1bbe0 65 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69  ecessary, the fi
1bbf0 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68  le opened,.** th
1bc00 65 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74  e pages are writ
1bc10 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ten out to the d
1bc20 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
1bc30 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74  list order. Writ
1bc40 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73  ing.** a page is
1bc50 20 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d   skipped if it m
1bc60 65 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74  eets either of t
1bc70 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
1bc80 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  teria:.**.**   *
1bc90 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
1bca0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1bcb0 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f   Pager.dbSize, o
1bcc0 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48  r.**   * The PGH
1bcd0 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c  DR_DONT_WRITE fl
1bce0 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65  ag is set on the
1bcf0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
1bd00 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61  writing out a pa
1bd10 67 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61  ge causes the da
1bd20 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67  tabase file to g
1bd30 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c  row, Pager.dbFil
1bd40 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61  eSize.** is upda
1bd50 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
1bd60 20 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72   If page 1 is wr
1bd70 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20  itten out, then 
1bd80 74 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64  the value cached
1bd90 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46  .** in Pager.dbF
1bda0 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64  ileVers[] is upd
1bdb0 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68  ated to match th
1bdc0 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72  e new value stor
1bdd0 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74  ed in.** the dat
1bde0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
1bdf0 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
1be00 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
1be10 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1be20 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
1be30 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c  rror .** occurs,
1be40 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
1be50 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
1be60 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53  r, if the EXCLUS
1be70 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a  IVE lock cannot.
1be80 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20  ** be obtained, 
1be90 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
1bea0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1beb0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
1bec0 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64  te_pagelist(PgHd
1bed0 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67  r *pList){.  Pag
1bee0 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20  er *pPager;     
1bef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf00 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
1bf10 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  t */.  int rc;  
1bf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1bf40 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
1bf50 20 69 66 28 20 4e 45 56 45 52 28 70 4c 69 73 74   if( NEVER(pList
1bf60 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 53 51  ==0) ) return SQ
1bf70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65  LITE_OK;.  pPage
1bf80 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65  r = pList->pPage
1bf90 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  r;..  /* At this
1bfa0 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79   point there may
1bfb0 20 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53   be either a RES
1bfc0 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
1bfd0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  VE lock on the. 
1bfe0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1bff0 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  e. If there is a
1c000 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53  lready an EXCLUS
1c010 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f  IVE lock, the fo
1c020 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c  llowing.  ** cal
1c030 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  l is a no-op..  
1c040 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74  **.  ** Moving t
1c050 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53  he lock from RES
1c060 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49  ERVED to EXCLUSI
1c070 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f  VE actually invo
1c080 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20  lves going.  ** 
1c090 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72  through an inter
1c0a0 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50 45  mediate state PE
1c0b0 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49  NDING.   A PENDI
1c0c0 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73  NG lock prevents
1c0d0 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72   new.  ** reader
1c0e0 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67  s from attaching
1c0f0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1c100 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69 63   but is unsuffic
1c110 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20  ient for us to. 
1c120 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20   ** write.  The 
1c130 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e  idea of a PENDIN
1c140 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65  G lock is to pre
1c150 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73  vent new readers
1c160 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e   from.  ** comin
1c170 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61  g in while we wa
1c180 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20  it for existing 
1c190 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72  readers to clear
1c1a0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c  ..  **.  ** Whil
1c1b0 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  e the pager is i
1c1c0 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20 73  n the RESERVED s
1c1d0 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e  tate, the origin
1c1e0 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
1c1f0 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67  .  ** is unchang
1c200 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f  ed and we can ro
1c210 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  llback without h
1c220 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63  aving to playbac
1c230 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e  k the.  ** journ
1c240 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67  al into the orig
1c250 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
1c260 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61  le.  Once we tra
1c270 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20  nsition to.  ** 
1c280 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65  EXCLUSIVE, it me
1c290 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
1c2a0 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63   file has been c
1c2b0 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72  hanged and any r
1c2c0 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c  ollback.  ** wil
1c2d0 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72  l require a jour
1c2e0 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20  nal playback..  
1c2f0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
1c300 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1c310 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
1c320 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
1c330 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
1c340 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
1c350 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69  ..  /* If the fi
1c360 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c  le is a temp-fil
1c370 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
1c380 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20  en opened, open 
1c390 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20  it now. It.  ** 
1c3a0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
1c3b0 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68  for rc to be oth
1c3c0 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
1c3d0 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e 63 68  K if this branch
1c3e0 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20  .  ** is taken, 
1c3f0 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  as pager_wait_on
1c400 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  _lock() is a no-
1c410 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65  op for temp-file
1c420 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69  s..  */.  if( !i
1c430 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1c440 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
1c450 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1c460 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
1c470 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  OK );.    rc = p
1c480 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61  agerOpentemp(pPa
1c490 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c  ger, pPager->fd,
1c4a0 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
1c4b0 73 29 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  s);.  }..  while
1c4c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c4d0 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  && pList ){.    
1c4e0 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73  Pgno pgno = pLis
1c4f0 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a  t->pgno;..    /*
1c500 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69   If there are di
1c510 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  rty pages in the
1c520 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68   page cache with
1c530 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72   page numbers gr
1c540 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  eater.    ** tha
1c550 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
1c560 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74  this means sqlit
1c570 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
1c580 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65  mage() was calle
1c590 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65  d to.    ** make
1c5a0 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65   the file smalle
1c5b0 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79  r (presumably by
1c5c0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64   auto-vacuum cod
1c5d0 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65  e). Do not write
1c5e0 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68  .    ** any such
1c5f0 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69   pages to the fi
1c600 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
1c610 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77  * Also, do not w
1c620 72 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67  rite out any pag
1c630 65 20 74 68 61 74 20 68 61 73 20 74 68 65 20 50  e that has the P
1c640 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20  GHDR_DONT_WRITE 
1c650 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20  flag.    ** set 
1c660 28 73 65 74 20 62 79 20 73 71 6c 69 74 65 33 50  (set by sqlite3P
1c670 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29  agerDontWrite())
1c680 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1c690 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64   pgno<=pPager->d
1c6a0 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69  bSize && 0==(pLi
1c6b0 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  st->flags&PGHDR_
1c6c0 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20  DONT_WRITE) ){. 
1c6d0 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20       i64 offset 
1c6e0 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
1c6f0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1c700 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f  ;   /* Offset to
1c710 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20   write */.      
1c720 63 68 61 72 20 2a 70 44 61 74 61 3b 20 20 20 20  char *pData;    
1c730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c750 2a 20 44 61 74 61 20 74 6f 20 77 72 69 74 65 20  * Data to write 
1c760 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20 20 2f 2a  */    ..      /*
1c770 20 45 6e 63 6f 64 65 20 74 68 65 20 64 61 74 61   Encode the data
1c780 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f  base */.      CO
1c790 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69  DEC2(pPager, pLi
1c7a0 73 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c  st->pData, pgno,
1c7b0 20 36 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54   6, return SQLIT
1c7c0 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 29 3b  E_NOMEM, pData);
1c7d0 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ..      /* Write
1c7e0 20 6f 75 74 20 74 68 65 20 70 61 67 65 20 64 61   out the page da
1c7f0 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ta. */.      rc 
1c800 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1c810 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61  (pPager->fd, pDa
1c820 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
1c830 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a  Size, offset);..
1c840 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65        /* If page
1c850 20 31 20 77 61 73 20 6a 75 73 74 20 77 72 69 74   1 was just writ
1c860 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65  ten, update Page
1c870 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20  r.dbFileVers to 
1c880 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74  match.      ** t
1c890 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f  he value now sto
1c8a0 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  red in the datab
1c8b0 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69  ase file. If wri
1c8c0 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20  ting this .     
1c8d0 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64 20   ** page caused 
1c8e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c8f0 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74  e to grow, updat
1c900 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20  e dbFileSize. . 
1c910 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1c920 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
1c930 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
1c940 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
1c950 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a   &pData[24], siz
1c960 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
1c970 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
1c980 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  }.      if( pgno
1c990 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
1c9a0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ize ){.        p
1c9b0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
1c9c0 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20  e = pgno;.      
1c9d0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  }..      /* Upda
1c9e0 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62  te any backup ob
1c9f0 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68  jects copying th
1ca00 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1ca10 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20  is pager. */.   
1ca20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
1ca30 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
1ca40 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
1ca50 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74 61 29  8*)pList->pData)
1ca60 3b 0a 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  ;..      PAGERTR
1ca70 41 43 45 28 28 22 53 54 4f 52 45 20 25 64 20 70  ACE(("STORE %d p
1ca80 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
1ca90 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
1caa0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
1cab0 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
1cac0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
1cad0 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49  List)));.      I
1cae0 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25  OTRACE(("PGOUT %
1caf0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
1cb00 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50   pgno));.      P
1cb10 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
1cb20 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
1cb30 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 50 41  count);.      PA
1cb40 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
1cb50 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 7d 65  >nWrite);.    }e
1cb60 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52  lse{.      PAGER
1cb70 54 52 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20  TRACE(("NOSTORE 
1cb80 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
1cb90 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1cba0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 23 69  pgno));.    }.#i
1cbb0 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
1cbc0 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 4c 69 73  K_PAGES.    pLis
1cbd0 74 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  t->pageHash = pa
1cbe0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69  ger_pagehash(pLi
1cbf0 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  st);.#endif.    
1cc00 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70  pList = pList->p
1cc10 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65  Dirty;.  }..  re
1cc20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1cc30 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63 6f 72  * Append a recor
1cc40 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  d of the current
1cc50 20 73 74 61 74 65 20 6f 66 20 70 61 67 65 20 70   state of page p
1cc60 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  Pg to the sub-jo
1cc70 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73  urnal. .** It is
1cc80 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73   the callers res
1cc90 70 6f 6e 73 69 62 69 6c 69 74 79 20 74 6f 20 75  ponsibility to u
1cca0 73 65 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  se subjRequiresP
1ccb0 61 67 65 28 29 20 74 6f 20 63 68 65 63 6b 20 0a  age() to check .
1ccc0 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20 72 65  ** that it is re
1ccd0 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 62 65  ally required be
1cce0 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69  fore calling thi
1ccf0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
1cd00 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
1cd10 20 73 65 74 20 74 68 65 20 62 69 74 20 63 6f 72   set the bit cor
1cd20 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50  responding to pP
1cd30 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62  g->pgno in the b
1cd40 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c  itvecs.** for al
1cd50 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  l open savepoint
1cd60 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  s before returni
1cd70 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ng..**.** This f
1cd80 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
1cd90 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
1cda0 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
1cdb0 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20  ssful, an IO.** 
1cdc0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68  error code if th
1cdd0 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  e attempt to wri
1cde0 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  te to the sub-jo
1cdf0 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20  urnal fails, or 
1ce00 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
1ce10 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
1ce20 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67  ls while setting
1ce30 20 61 20 62 69 74 20 69 6e 20 61 20 73 61 76 65   a bit in a save
1ce40 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e  point.** bitvec.
1ce50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1ce60 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67  ubjournalPage(Pg
1ce70 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74  Hdr *pPg){.  int
1ce80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1ce90 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1cea0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
1ceb0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
1cec0 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
1ced0 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20    void *pData = 
1cee0 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20  pPg->pData;.    
1cef0 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70 50 61  i64 offset = pPa
1cf00 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b  ger->nSubRec*(4+
1cf10 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1cf20 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 44 61  );.    char *pDa
1cf30 74 61 32 3b 0a 0a 20 20 20 20 43 4f 44 45 43 32  ta2;..    CODEC2
1cf40 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
1cf50 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65  pPg->pgno, 7, re
1cf60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1cf70 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20  M, pData2);.    
1cf80 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4d  PAGERTRACE(("STM
1cf90 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  T-JOURNAL %d pag
1cfa0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
1cfb0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1cfc0 67 6e 6f 29 29 3b 0a 20 20 0a 20 20 20 20 61 73  gno));.  .    as
1cfd0 73 65 72 74 28 20 70 61 67 65 49 6e 4a 6f 75 72  sert( pageInJour
1cfe0 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70 50 67 2d  nal(pPg) || pPg-
1cff0 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
1d000 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20  OrigSize );.    
1d010 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
1d020 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f  (pPager->sjfd, o
1d030 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f  ffset, pPg->pgno
1d040 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1d050 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d060 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1d070 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 6a  Write(pPager->sj
1d080 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67  fd, pData2, pPag
1d090 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
1d0a0 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 7d 0a 20  fset+4);.    }. 
1d0b0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1d0c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
1d0d0 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b  ager->nSubRec++;
1d0e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1d0f0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e  ger->nSavepoint>
1d100 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64  0 );.    rc = ad
1d110 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
1d120 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
1d130 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 74 65 73 74  >pgno);.    test
1d140 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
1d150 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74  _OK );.  }.  ret
1d160 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
1d170 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1d180 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
1d190 20 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68   pcache layer wh
1d1a0 65 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65  en it has reache
1d1b0 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d  d some.** soft m
1d1c0 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65  emory limit. The
1d1d0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1d1e0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1d1f0 61 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a  a Pager object.*
1d200 2a 20 28 63 61 73 74 20 61 73 20 61 20 76 6f 69  * (cast as a voi
1d210 64 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20 69  d*). The pager i
1d220 73 20 61 6c 77 61 79 73 20 27 70 75 72 67 65 61  s always 'purgea
1d230 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d  ble' (not an in-
1d240 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61  memory.** databa
1d250 73 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  se). The second 
1d260 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65  argument is a re
1d270 66 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67  ference to a pag
1d280 65 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75  e that is .** cu
1d290 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75  rrently dirty bu
1d2a0 74 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e  t has no outstan
1d2b0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e  ding references.
1d2c0 20 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20   The page.** is 
1d2d0 61 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74 65  always associate
1d2e0 64 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72  d with the Pager
1d2f0 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
1d300 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20  s the first .** 
1d310 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
1d320 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
1d330 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d  function is to m
1d340 61 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79  ake pPg clean by
1d350 20 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e   writing its con
1d360 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20  tents.** out to 
1d370 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1d380 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20  e, if possible. 
1d390 54 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65  This may involve
1d3a0 20 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20   syncing the.** 
1d3b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a  journal file. .*
1d3c0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
1d3d0 75 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68  ul, sqlite3Pcach
1d3e0 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20  eMakeClean() is 
1d3f0 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61  called on the pa
1d400 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  ge and.** SQLITE
1d410 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
1d420 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
1d430 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
1d440 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20   to make the.** 
1d450 70 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20  page clean, the 
1d460 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
1d470 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68   returned. If th
1d480 65 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65  e page cannot be
1d490 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66  .** made clean f
1d4a0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65  or some other re
1d4b0 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72  ason, but no err
1d4c0 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
1d4d0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
1d4e0 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
1d4f0 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
1d500 61 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c  an() is not call
1d510 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1d520 74 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f  t pagerStress(vo
1d530 69 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50  id *p, PgHdr *pP
1d540 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
1d550 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70  ger = (Pager *)p
1d560 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1d570 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
1d580 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  t( pPg->pPager==
1d590 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65  pPager );.  asse
1d5a0 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  rt( pPg->flags&P
1d5b0 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20  GHDR_DIRTY );.. 
1d5c0 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 79 6e   /* The doNotSyn
1d5d0 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 62 79  c flag is set by
1d5e0 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
1d5f0 72 57 72 69 74 65 28 29 20 66 75 6e 63 74 69 6f  rWrite() functio
1d600 6e 20 77 68 69 6c 65 20 69 74 0a 20 20 2a 2a 20  n while it.  ** 
1d610 69 73 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 61  is journalling a
1d620 20 73 65 74 20 6f 66 20 74 77 6f 20 6f 72 20 6d   set of two or m
1d630 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67  ore database pag
1d640 65 73 20 74 68 61 74 20 61 72 65 20 73 74 6f 72  es that are stor
1d650 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73  ed.  ** on the s
1d660 61 6d 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  ame disk sector.
1d670 20 53 79 6e 63 69 6e 67 20 74 68 65 20 6a 6f 75   Syncing the jou
1d680 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  rnal is not allo
1d690 77 65 64 20 77 68 69 6c 65 0a 20 20 2a 2a 20 74  wed while.  ** t
1d6a0 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
1d6b0 20 61 73 20 69 74 20 69 73 20 69 6d 70 6f 72 74   as it is import
1d6c0 61 6e 74 20 74 68 61 74 20 61 6c 6c 20 6d 65 6d  ant that all mem
1d6d0 62 65 72 73 20 6f 66 20 73 75 63 68 20 61 0a 20  bers of such a. 
1d6e0 20 2a 2a 20 73 65 74 20 6f 66 20 70 61 67 65 73   ** set of pages
1d6f0 20 61 72 65 20 73 79 6e 63 65 64 20 74 6f 20 64   are synced to d
1d700 69 73 6b 20 74 6f 67 65 74 68 65 72 2e 20 53 6f  isk together. So
1d710 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 74 68  , if the page th
1d720 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  is function.  **
1d730 20 69 73 20 74 72 79 69 6e 67 20 74 6f 20 6d 61   is trying to ma
1d740 6b 65 20 63 6c 65 61 6e 20 77 69 6c 6c 20 72 65  ke clean will re
1d750 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20  quire a journal 
1d760 73 79 6e 63 20 61 6e 64 20 74 68 65 20 64 6f 4e  sync and the doN
1d770 6f 74 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67  otSync.  ** flag
1d780 20 69 73 20 73 65 74 2c 20 72 65 74 75 72 6e 20   is set, return 
1d790 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
1d7a0 79 74 68 69 6e 67 2e 20 54 68 65 20 70 63 61 63  ything. The pcac
1d7b0 68 65 20 6c 61 79 65 72 20 77 69 6c 6c 0a 20 20  he layer will.  
1d7c0 2a 2a 20 6a 75 73 74 20 68 61 76 65 20 74 6f 20  ** just have to 
1d7d0 67 6f 20 61 68 65 61 64 20 61 6e 64 20 61 6c 6c  go ahead and all
1d7e0 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
1d7f0 20 62 75 66 66 65 72 20 69 6e 73 74 65 61 64 20   buffer instead 
1d800 6f 66 0a 20 20 2a 2a 20 72 65 75 73 69 6e 67 20  of.  ** reusing 
1d810 70 50 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  pPg..  **.  ** S
1d820 69 6d 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65  imilarly, if the
1d830 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61   pager has alrea
1d840 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 65  dy entered the e
1d850 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20 6e  rror state, do n
1d860 6f 74 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 77  ot.  ** try to w
1d870 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  rite the content
1d880 73 20 6f 66 20 70 50 67 20 74 6f 20 64 69 73 6b  s of pPg to disk
1d890 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
1d8a0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
1d8b0 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79  (pPager->doNotSy
1d8c0 6e 63 20 26 26 20 70 50 67 2d 3e 66 6c 61 67 73  nc && pPg->flags
1d8d0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
1d8e0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1d8f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
1d900 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f    /* Sync the jo
1d910 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65  urnal file if re
1d920 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28  quired. */.  if(
1d930 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
1d940 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20  R_NEED_SYNC ){. 
1d950 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72     rc = syncJour
1d960 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
1d970 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d980 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 66 75  OK && pPager->fu
1d990 6c 6c 53 79 6e 63 20 26 26 20 0a 20 20 20 20 20  llSync && .     
1d9a0 20 21 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   !(pPager->journ
1d9b0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
1d9c0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
1d9d0 29 20 26 26 0a 20 20 20 20 20 20 21 28 73 71 6c  ) &&.      !(sql
1d9e0 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
1d9f0 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
1da00 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
1da10 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
1da20 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70  ).    ){.      p
1da30 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
1da40 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
1da50 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
1da60 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
1da70 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
1da80 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 69 73 20   number of this 
1da90 70 61 67 65 20 69 73 20 6c 61 72 67 65 72 20 74  page is larger t
1daa0 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
1dab0 73 69 7a 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65  size of.  ** the
1dac0 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c   database image,
1dad0 20 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20   it may need to 
1dae0 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
1daf0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  e sub-journal.. 
1db00 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61   ** This is beca
1db10 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  use the call to 
1db20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
1db30 6c 69 73 74 28 29 20 62 65 6c 6f 77 20 77 69 6c  list() below wil
1db40 6c 20 6e 6f 74 0a 20 20 2a 2a 20 61 63 74 75 61  l not.  ** actua
1db50 6c 6c 79 20 77 72 69 74 65 20 64 61 74 61 20 74  lly write data t
1db60 6f 20 74 68 65 20 66 69 6c 65 20 69 6e 20 74 68  o the file in th
1db70 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  is case..  **.  
1db80 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20  ** Consider the 
1db90 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 71 75 65 6e  following sequen
1dba0 63 65 20 6f 66 20 65 76 65 6e 74 73 3a 0a 20 20  ce of events:.  
1dbb0 2a 2a 0a 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b  **.  **   BEGIN;
1dbc0 0a 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e  .  **     <journ
1dbd0 61 6c 20 70 61 67 65 20 58 3e 0a 20 20 2a 2a 20  al page X>.  ** 
1dbe0 20 20 20 20 3c 6d 6f 64 69 66 79 20 70 61 67 65      <modify page
1dbf0 20 58 3e 0a 20 20 2a 2a 20 20 20 20 20 53 41 56   X>.  **     SAV
1dc00 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20 2a 2a 20  EPOINT sp;.  ** 
1dc10 20 20 20 20 20 20 3c 73 68 72 69 6e 6b 20 64 61        <shrink da
1dc20 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 59  tabase file to Y
1dc30 20 70 61 67 65 73 3e 0a 20 20 2a 2a 20 20 20 20   pages>.  **    
1dc40 20 20 20 70 61 67 65 72 53 74 72 65 73 73 28 70     pagerStress(p
1dc50 61 67 65 20 58 29 0a 20 20 2a 2a 20 20 20 20 20  age X).  **     
1dc60 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a  ROLLBACK TO sp;.
1dc70 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 28 58 3e    **.  ** If (X>
1dc80 59 29 2c 20 74 68 65 6e 20 77 68 65 6e 20 70 61  Y), then when pa
1dc90 67 65 72 53 74 72 65 73 73 20 69 73 20 63 61 6c  gerStress is cal
1dca0 6c 65 64 20 70 61 67 65 20 58 20 77 69 6c 6c 20  led page X will 
1dcb0 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 0a 20  not be written. 
1dcc0 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64   ** out to the d
1dcd0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 62 75  atabase file, bu
1dce0 74 20 77 69 6c 6c 20 62 65 20 64 72 6f 70 70 65  t will be droppe
1dcf0 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  d from the cache
1dd00 2e 20 54 68 65 6e 2c 0a 20 20 2a 2a 20 66 6f 6c  . Then,.  ** fol
1dd10 6c 6f 77 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c  lowing the "ROLL
1dd20 42 41 43 4b 20 54 4f 20 73 70 22 20 73 74 61 74  BACK TO sp" stat
1dd30 65 6d 65 6e 74 2c 20 72 65 61 64 69 6e 67 20 70  ement, reading p
1dd40 61 67 65 20 58 20 77 69 6c 6c 20 72 65 61 64 0a  age X will read.
1dd50 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74    ** data from t
1dd60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1dd70 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74  . This will be t
1dd80 68 65 20 63 6f 70 79 20 6f 66 20 70 61 67 65 20  he copy of page 
1dd90 58 20 61 73 20 69 74 0a 20 20 2a 2a 20 77 61 73  X as it.  ** was
1dda0 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
1ddb0 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 6e  ction started, n
1ddc0 6f 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65  ot as it was whe
1ddd0 6e 20 22 53 41 56 45 50 4f 49 4e 54 20 73 70 22  n "SAVEPOINT sp"
1dde0 0a 20 20 2a 2a 20 77 61 73 20 65 78 65 63 75 74  .  ** was execut
1ddf0 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ed..  **.  ** Th
1de00 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f  e solution is to
1de10 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
1de20 6e 74 20 64 61 74 61 20 66 6f 72 20 70 61 67 65  nt data for page
1de30 20 58 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 2a   X into the .  *
1de40 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  * sub-journal fi
1de50 6c 65 20 6e 6f 77 20 28 69 66 20 69 74 20 69 73  le now (if it is
1de60 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 74 68 65   not already the
1de70 72 65 29 2c 20 73 6f 20 74 68 61 74 20 69 74 20  re), so that it 
1de80 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 73  will.  ** be res
1de90 74 6f 72 65 64 20 74 6f 20 69 74 73 20 63 75 72  tored to its cur
1dea0 72 65 6e 74 20 76 61 6c 75 65 20 77 68 65 6e 20  rent value when 
1deb0 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  the "ROLLBACK TO
1dec0 20 73 70 22 20 69 73 20 0a 20 20 2a 2a 20 65 78   sp" is .  ** ex
1ded0 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  ecuted..  */.  i
1dee0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1def0 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50   && pPg->pgno>pP
1df00 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20  ager->dbSize && 
1df10 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
1df20 28 70 50 67 29 20 29 7b 0a 20 20 20 20 72 63 20  (pPg) ){.    rc 
1df30 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  = subjournalPage
1df40 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  (pPg);.  }..  /*
1df50 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65   Write the conte
1df60 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
1df70 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
1df80 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 69  ase file. */.  i
1df90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1dfa0 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69   ){.    pPg->pDi
1dfb0 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  rty = 0;.    rc 
1dfc0 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
1dfd0 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 7d  gelist(pPg);.  }
1dfe0 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
1dff0 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a  page as clean. *
1e000 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
1e010 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47  TE_OK ){.    PAG
1e020 45 52 54 52 41 43 45 28 28 22 53 54 52 45 53 53  ERTRACE(("STRESS
1e030 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
1e040 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1e050 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
1e060 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
1e070 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
1e080 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67   }..  return pag
1e090 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
1e0a0 20 72 63 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   rc);.}.../*.** 
1e0b0 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
1e0c0 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61  tialize a new Pa
1e0d0 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70  ger object and p
1e0e0 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ut a pointer to 
1e0f0 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65  it.** in *ppPage
1e100 72 2e 20 54 68 65 20 70 61 67 65 72 20 73 68 6f  r. The pager sho
1e110 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62  uld eventually b
1e120 65 20 66 72 65 65 64 20 62 79 20 70 61 73 73 69  e freed by passi
1e130 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69  ng it.** to sqli
1e140 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e  te3PagerClose().
1e150 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65  .**.** The zFile
1e160 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73  name argument is
1e170 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65   the path to the
1e180 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1e190 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46  o open..** If zF
1e1a0 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
1e1b0 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
1e1c0 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
1e1d0 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
1e1e0 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
1e1f0 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
1e200 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20  ched. Temporary 
1e210 66 69 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c  files are be del
1e220 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69  eted.** automati
1e230 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20  cally when they 
1e240 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a  are closed. If z
1e250 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
1e260 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20  mory:" then .** 
1e270 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
1e280 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65  is held in cache
1e290 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72  . It is never wr
1e2a0 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a  itten to disk. .
1e2b0 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  ** This can be u
1e2c0 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
1e2d0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
1e2e0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
1e2f0 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74  e nExtra paramet
1e300 65 72 20 73 70 65 63 69 66 69 65 73 20 74 68 65  er specifies the
1e310 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1e320 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61   of space alloca
1e330 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74  ted.** along wit
1e340 68 20 65 61 63 68 20 70 61 67 65 20 72 65 66 65  h each page refe
1e350 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63  rence. This spac
1e360 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74  e is available t
1e370 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69  o the user.** vi
1e380 61 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  a the sqlite3Pag
1e390 65 72 47 65 74 45 78 74 72 61 28 29 20 41 50 49  erGetExtra() API
1e3a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
1e3b0 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73  s argument is us
1e3c0 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 70 72  ed to specify pr
1e3d0 6f 70 65 72 74 69 65 73 20 74 68 61 74 20 61 66  operties that af
1e3e0 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72  fect the.** oper
1e3f0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67  ation of the pag
1e400 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65  er. It should be
1e410 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74   passed some bit
1e420 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wise combination
1e430 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52  .** of the PAGER
1e440 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e  _OMIT_JOURNAL an
1e450 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c  d PAGER_NO_READL
1e460 4f 43 4b 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a  OCK flags..**.**
1e470 20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70 61   The vfsFlags pa
1e480 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74  rameter is a bit
1e490 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20  mask to pass to 
1e4a0 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
1e4b0 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f  ter.** of the xO
1e4c0 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20  pen() method of 
1e4d0 74 68 65 20 73 75 70 70 6c 69 65 64 20 56 46 53  the supplied VFS
1e4e0 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69   when opening fi
1e4f0 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  les. .**.** If t
1e500 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
1e510 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
1e520 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
1e530 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73  ile opened .** s
1e540 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c  uccessfully, SQL
1e550 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1e560 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20  ed and *ppPager 
1e570 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a  set to point to.
1e580 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 72  ** the new pager
1e590 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65   object. If an e
1e5a0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70  rror occurs, *pp
1e5b0 50 61 67 65 72 20 69 73 20 73 65 74 20 74 6f 20  Pager is set to 
1e5c0 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f  NULL.** and erro
1e5d0 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e  r code returned.
1e5e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
1e5f0 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
1e600 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74  _NOMEM.** (sqlit
1e610 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73  e3Malloc() is us
1e620 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  ed to allocate m
1e630 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43  emory), SQLITE_C
1e640 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76  ANTOPEN or .** v
1e650 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f  arious SQLITE_IO
1e660 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a  _XXX errors..*/.
1e670 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1e680 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
1e690 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
1e6a0 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
1e6b0 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75  file system to u
1e6c0 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a  se */.  Pager **
1e6d0 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  ppPager,        
1e6e0 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20   /* OUT: Return 
1e6f0 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
1e700 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
1e710 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1e720 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame,   /* Name o
1e730 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1e740 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ile to open */. 
1e750 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20   int nExtra,    
1e760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
1e770 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20  ra bytes append 
1e780 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
1e790 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  y page */.  int 
1e7a0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
1e7b0 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f       /* flags co
1e7c0 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66  ntrolling this f
1e7d0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ile */.  int vfs
1e7e0 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
1e7f0 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65    /* flags passe
1e800 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c  d through to sql
1e810 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
1e820 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74   */.){.  u8 *pPt
1e830 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r;.  Pager *pPag
1e840 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
1e850 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f   Pager object to
1e860 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   allocate and re
1e870 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  turn */.  int rc
1e880 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
1e890 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1e8a0 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46  e */.  int tempF
1e8b0 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ile = 0;        
1e8c0 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70  /* True for temp
1e8d0 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e   files (incl. in
1e8e0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a  -memory files) *
1e8f0 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20  /.  int memDb = 
1e900 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
1e910 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
1e920 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  an in-memory fil
1e930 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f  e */.  int readO
1e940 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nly = 0;        
1e950 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
1e960 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66  is a read-only f
1e970 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75  ile */.  int jou
1e980 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20  rnalFileSize;   
1e990 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
1e9a0 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68 20  locate for each 
1e9b0 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20  journal fd */.  
1e9c0 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20  char *zPathname 
1e9d0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c  = 0;     /* Full
1e9e0 20 70 61 74 68 20 74 6f 20 64 61 74 61 62 61 73   path to databas
1e9f0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
1ea00 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20  nPathname = 0;  
1ea10 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1ea20 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68  f bytes in zPath
1ea30 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73  name */.  int us
1ea40 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67  eJournal = (flag
1ea50 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a  s & PAGER_OMIT_J
1ea60 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46  OURNAL)==0; /* F
1ea70 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75  alse to omit jou
1ea80 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  rnal */.  int no
1ea90 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67  Readlock = (flag
1eaa0 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41  s & PAGER_NO_REA
1eab0 44 4c 4f 43 4b 29 21 3d 30 3b 20 20 2f 2a 20 54  DLOCK)!=0;  /* T
1eac0 72 75 65 20 74 6f 20 6f 6d 69 74 20 72 65 61 64  rue to omit read
1ead0 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70  -lock */.  int p
1eae0 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69  cacheSize = sqli
1eaf0 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b  te3PcacheSize();
1eb00 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
1eb10 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20  to allocate for 
1eb20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 31 36 20  PCache */.  u16 
1eb30 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
1eb40 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
1eb50 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75  _SIZE;  /* Defau
1eb60 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  lt page size */.
1eb70 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
1eb80 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20   how much space 
1eb90 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  is required for 
1eba0 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  each journal fil
1ebb0 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74  e-handle.  ** (t
1ebc0 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20  here are two of 
1ebd0 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a  them, the main j
1ebe0 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73  ournal and the s
1ebf0 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69  ub-journal). Thi
1ec00 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 6d 61  s.  ** is the ma
1ec10 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71 75  ximum space requ
1ec20 69 72 65 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  ired for an in-m
1ec30 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
1ec40 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20  le handle .  ** 
1ec50 61 6e 64 20 61 20 72 65 67 75 6c 61 72 20 6a 6f  and a regular jo
1ec60 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c  urnal file-handl
1ec70 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 20 22  e. Note that a "
1ec80 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d  regular journal-
1ec90 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79  handle".  ** may
1eca0 20 62 65 20 61 20 77 72 61 70 70 65 72 20 63 61   be a wrapper ca
1ecb0 70 61 62 6c 65 20 6f 66 20 63 61 63 68 69 6e 67  pable of caching
1ecc0 20 74 68 65 20 66 69 72 73 74 20 70 6f 72 74 69   the first porti
1ecd0 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  on of the journa
1ece0 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d  l.  ** file in m
1ecf0 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65  emory to impleme
1ed00 6e 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  nt the atomic-wr
1ed10 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
1ed20 20 28 73 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72   (see .  ** sour
1ed30 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e  ce file journal.
1ed40 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  c)..  */.  if( s
1ed50 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a  qlite3JournalSiz
1ed60 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65 33 4d  e(pVfs)>sqlite3M
1ed70 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20  emJournalSize() 
1ed80 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  ){.    journalFi
1ed90 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28  leSize = ROUND8(
1eda0 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69  sqlite3JournalSi
1edb0 7a 65 28 70 56 66 73 29 29 3b 0a 20 20 7d 65 6c  ze(pVfs));.  }el
1edc0 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46  se{.    journalF
1edd0 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38  ileSize = ROUND8
1ede0 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e  (sqlite3MemJourn
1edf0 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a  alSize());.  }..
1ee00 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74    /* Set the out
1ee10 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20  put variable to 
1ee20 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20  NULL in case an 
1ee30 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f  error occurs. */
1ee40 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b  .  *ppPager = 0;
1ee50 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61  ..  /* Compute a
1ee60 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c  nd store the ful
1ee70 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e  l pathname in an
1ee80 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65   allocated buffe
1ee90 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74  r pointed.  ** t
1eea0 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20  o by zPathname, 
1eeb0 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65  length nPathname
1eec0 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73  . Or, if this is
1eed0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
1eee0 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f  e,.  ** leave bo
1eef0 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64  th nPathname and
1ef00 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74   zPathname set t
1ef10 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  o 0..  */.  if( 
1ef20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
1ef30 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
1ef40 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66   nPathname = pVf
1ef50 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
1ef60 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d  .    zPathname =
1ef70 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e   sqlite3Malloc(n
1ef80 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20  Pathname*2);.   
1ef90 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d   if( zPathname==
1efa0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
1efb0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
1efc0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1efd0 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
1efe0 44 42 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  DB.    if( strcm
1eff0 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65  p(zFilename,":me
1f000 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20  mory:")==0 ){.  
1f010 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20      memDb = 1;. 
1f020 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30       zPathname[0
1f030 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  ] = 0;.    }else
1f040 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20  .#endif.    {.  
1f050 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d      zPathname[0]
1f060 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75   = 0; /* Make su
1f070 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65  re initialized e
1f080 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e  ven if FullPathn
1f090 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20  ame() fails */. 
1f0a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f0b0 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
1f0c0 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  pVfs, zFilename,
1f0d0 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74   nPathname, zPat
1f0e0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20  hname);.    }.. 
1f0f0 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73     nPathname = s
1f100 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1f110 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Pathname);.    i
1f120 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1f130 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e   && nPathname+8>
1f140 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1f150 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
1f160 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
1f170 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  n when the journ
1f180 61 6c 20 70 61 74 68 20 72 65 71 75 69 72 65 64  al path required
1f190 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   by.      ** the
1f1a0 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20   database being 
1f1b0 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d  opened will be m
1f1c0 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d  ore than pVfs->m
1f1d0 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20  xPathname.      
1f1e0 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67  ** bytes in leng
1f1f0 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  th. This means t
1f200 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
1f210 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20  ot be opened,.  
1f220 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c      ** as it wil
1f230 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c  l not be possibl
1f240 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f  e to open the jo
1f250 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76  urnal file or ev
1f260 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63  en.      ** chec
1f270 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  k for a hot-jour
1f280 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69  nal before readi
1f290 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ng..      */.   
1f2a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
1f2b0 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a 20  ANTOPEN;.    }. 
1f2c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f2d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
1f2e0 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68  lite3_free(zPath
1f2f0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  name);.      ret
1f300 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1f310 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
1f320 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20   memory for the 
1f330 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  Pager structure,
1f340 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20   PCache object, 
1f350 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66  the.  ** three f
1f360 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c  ile descriptors,
1f370 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f380 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
1f390 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
1f3a0 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79  le name. The lay
1f3b0 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73  out in memory is
1f3c0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
1f3d0 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72  *.  **     Pager
1f3e0 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
1f3f0 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65             (size
1f400 6f 66 28 50 61 67 65 72 29 20 62 79 74 65 73 29  of(Pager) bytes)
1f410 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65  .  **     PCache
1f420 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
1f430 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
1f440 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 20 62  e3PcacheSize() b
1f450 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44  ytes).  **     D
1f460 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e  atabase file han
1f470 64 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 28  dle            (
1f480 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62  pVfs->szOsFile b
1f490 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53  ytes).  **     S
1f4a0 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
1f4b0 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28  handle         (
1f4c0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
1f4d0 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
1f4e0 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  Main journal fil
1f4f0 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
1f500 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
1f510 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
1f520 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   Database file n
1f530 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
1f540 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79   (nPathname+1 by
1f550 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f  tes).  **     Jo
1f560 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
1f570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
1f580 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74  Pathname+8+1 byt
1f590 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20  es).  */.  pPtr 
1f5a0 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d  = (u8 *)sqlite3M
1f5b0 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52  allocZero(.    R
1f5c0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50  OUND8(sizeof(*pP
1f5d0 61 67 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a  ager)) +      /*
1f5e0 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
1f5f0 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70   */.    ROUND8(p
1f600 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20  cacheSize) +    
1f610 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65         /* PCache
1f620 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52   object */.    R
1f630 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73  OUND8(pVfs->szOs
1f640 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a  File) +       /*
1f650 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c   The main db fil
1f660 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  e */.    journal
1f670 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20  FileSize * 2 +  
1f680 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1f690 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  wo journal files
1f6a0 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61   */ .    nPathna
1f6b0 6d 65 20 2b 20 31 20 2b 20 20 20 20 20 20 20 20  me + 1 +        
1f6c0 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65          /* zFile
1f6d0 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74  name */.    nPat
1f6e0 68 6e 61 6d 65 20 2b 20 38 20 2b 20 31 20 20 20  hname + 8 + 1   
1f6f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a             /* zJ
1f700 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 29 3b 0a 20  ournal */.  );. 
1f710 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
1f720 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51  YTE_ALIGNMENT(SQ
1f730 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
1f740 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
1f750 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74 72  ) );.  if( !pPtr
1f760 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1f770 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b  free(zPathname);
1f780 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1f790 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
1f7a0 70 50 61 67 65 72 20 3d 20 20 20 20 20 20 20 20  pPager =        
1f7b0 20 20 20 20 20 20 28 50 61 67 65 72 2a 29 28 70        (Pager*)(p
1f7c0 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Ptr);.  pPager->
1f7d0 70 50 43 61 63 68 65 20 3d 20 20 20 20 28 50 43  pPCache =    (PC
1f7e0 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d 20 52  ache*)(pPtr += R
1f7f0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50  OUND8(sizeof(*pP
1f800 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61 67 65  ager)));.  pPage
1f810 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c 69 74  r->fd =   (sqlit
1f820 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b  e3_file*)(pPtr +
1f830 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53  = ROUND8(pcacheS
1f840 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  ize));.  pPager-
1f850 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33  >sjfd = (sqlite3
1f860 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20  _file*)(pPtr += 
1f870 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f  ROUND8(pVfs->szO
1f880 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61 67 65  sFile));.  pPage
1f890 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69 74  r->jfd =  (sqlit
1f8a0 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b  e3_file*)(pPtr +
1f8b0 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  = journalFileSiz
1f8c0 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46  e);.  pPager->zF
1f8d0 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28 63 68  ilename =    (ch
1f8e0 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75  ar*)(pPtr += jou
1f8f0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20  rnalFileSize);. 
1f900 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
1f910 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50  YTE_ALIGNMENT(pP
1f920 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20  ager->jfd) );.. 
1f930 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
1f940 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20  Pager.zFilename 
1f950 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e  and Pager.zJourn
1f960 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20 72  al buffers, if r
1f970 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66  equired. */.  if
1f980 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ( zPathname ){. 
1f990 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72     pPager->zJour
1f9a0 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28  nal =   (char*)(
1f9b0 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d  pPtr += nPathnam
1f9c0 65 20 2b 20 31 29 3b 0a 20 20 20 20 6d 65 6d 63  e + 1);.    memc
1f9d0 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  py(pPager->zFile
1f9e0 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  name, zPathname,
1f9f0 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
1fa00 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
1fa10 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e  zJournal, zPathn
1fa20 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b  ame, nPathname);
1fa30 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61  .    memcpy(&pPa
1fa40 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50  ger->zJournal[nP
1fa50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72  athname], "-jour
1fa60 6e 61 6c 22 2c 20 38 29 3b 0a 20 20 20 20 69 66  nal", 8);.    if
1fa70 28 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  ( pPager->zFilen
1fa80 61 6d 65 5b 30 5d 3d 3d 30 20 29 20 70 50 61 67  ame[0]==0 ) pPag
1fa90 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 30 5d 20  er->zJournal[0] 
1faa0 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
1fab0 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
1fac0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1fad0 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70  pVfs = pVfs;.  p
1fae0 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20  Pager->vfsFlags 
1faf0 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f  = vfsFlags;..  /
1fb00 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72  * Open the pager
1fb10 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
1fb20 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
1fb30 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21  Filename[0] && !
1fb40 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69 6e 74  memDb ){.    int
1fb50 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20   fout = 0;      
1fb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fb70 20 56 46 53 20 66 6c 61 67 73 20 72 65 74 75 72   VFS flags retur
1fb80 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a  ned by xOpen() *
1fb90 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
1fba0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
1fbb0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
1fbc0 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66  , pPager->fd, vf
1fbd0 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a  sFlags, &fout);.
1fbe0 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28      readOnly = (
1fbf0 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
1fc00 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20  _READONLY);..   
1fc10 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
1fc20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
1fc30 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64   opened for read
1fc40 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20  /write access,. 
1fc50 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64     ** choose a d
1fc60 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
1fc70 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65   in case we have
1fc80 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20   to create the. 
1fc90 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1fca0 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74  ile. The default
1fcb0 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68   page size is th
1fcc0 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20  e maximum of:.  
1fcd0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b    **.    **    +
1fce0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1fcf0 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a  PAGE_SIZE,.    *
1fd00 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65  *    + The value
1fd10 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
1fd20 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
1fd30 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  ().    **    + T
1fd40 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20  he largest page 
1fd50 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65  size that can be
1fd60 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
1fd70 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lly..    */.    
1fd80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1fd90 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29  K && !readOnly )
1fda0 7b 0a 20 20 20 20 20 20 73 65 74 53 65 63 74 6f  {.      setSecto
1fdb0 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
1fdc0 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
1fdd0 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
1fde0 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  SIZE<=SQLITE_MAX
1fdf0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
1fe00 5a 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ZE);.      if( s
1fe10 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72  zPageDflt<pPager
1fe20 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a  ->sectorSize ){.
1fe30 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
1fe40 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53  er->sectorSize>S
1fe50 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
1fe60 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20  T_PAGE_SIZE ){. 
1fe70 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
1fe80 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  flt = SQLITE_MAX
1fe90 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
1fea0 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ZE;.        }els
1feb0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50  e{.          szP
1fec0 61 67 65 44 66 6c 74 20 3d 20 28 75 31 36 29 70  ageDflt = (u16)p
1fed0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
1fee0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
1fef0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
1ff00 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
1ff10 5f 57 52 49 54 45 0a 20 20 20 20 20 20 7b 0a 20  _WRITE.      {. 
1ff20 20 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d         int iDc =
1ff30 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
1ff40 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
1ff50 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
1ff60 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
1ff70 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
1ff80 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
1ff90 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
1ffa0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
1ffb0 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
1ffc0 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
1ffd0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1ffe0 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  t(SQLITE_MAX_DEF
1fff0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
20000 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20  65536);.        
20010 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c  for(ii=szPageDfl
20020 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41  t; ii<=SQLITE_MA
20030 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
20040 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20  IZE; ii=ii*2){. 
20050 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63           if( iDc
20060 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
20070 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29  TOMIC|(ii>>8)) )
20080 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a  {.            sz
20090 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20  PageDflt = ii;. 
200a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
200b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
200c0 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  dif.    }.  }els
200d0 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74  e{.    /* If a t
200e0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
200f0 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69   requested, it i
20100 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d  s not opened imm
20110 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a  ediately..    **
20120 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65   In this case we
20130 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66 61   accept the defa
20140 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ult page size an
20150 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79  d delay actually
20160 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20  .    ** opening 
20170 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74  the file until t
20180 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
20190 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20   OsWrite()..    
201a0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  **.    ** This b
201b0 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75  ranch is also ru
201c0 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  n for an in-memo
201d0 72 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20  ry database. An 
201e0 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a  in-memory.    **
201f0 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65   database is the
20200 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d   same as a temp-
20210 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76  file that is nev
20220 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  er written out t
20230 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e  o.    ** disk an
20240 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d  d uses an in-mem
20250 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ory rollback jou
20260 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20 20  rnal..    */ .  
20270 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a    tempFile = 1;.
20280 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
20290 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
202a0 49 56 45 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c  IVE;.    readOnl
202b0 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53 51  y = (vfsFlags&SQ
202c0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
202d0 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  LY);.  }..  /* T
202e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  he following cal
202f0 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50 61 67  l to PagerSetPag
20300 65 73 69 7a 65 28 29 20 73 65 72 76 65 73 20 74  esize() serves t
20310 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20  o set the value 
20320 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70  of .  ** Pager.p
20330 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61  ageSize and to a
20340 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65  llocate the Page
20350 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66  r.pTmpSpace buff
20360 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  er..  */.  if( r
20370 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
20380 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
20390 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a  er->memDb==0 );.
203a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
203b0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
203c0 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65  (pPager, &szPage
203d0 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74  Dflt, -1);.    t
203e0 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
203f0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20  ITE_OK );.  }.. 
20400 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
20410 6f 63 63 75 72 72 65 64 20 69 6e 20 65 69 74 68  occurred in eith
20420 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73  er of the blocks
20430 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65   above, free the
20440 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 73 74 72   .  ** Pager str
20450 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65  ucture and close
20460 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a   the file..  */.
20470 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20480 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
20490 74 28 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70  t( !pPager->pTmp
204a0 53 70 61 63 65 20 29 3b 0a 20 20 20 20 73 71 6c  Space );.    sql
204b0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
204c0 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c  er->fd);.    sql
204d0 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
204e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
204f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
20500 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68  ialize the PCach
20510 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 61  e object. */.  a
20520 73 73 65 72 74 28 20 6e 45 78 74 72 61 3c 31 30  ssert( nExtra<10
20530 30 30 20 29 3b 0a 20 20 6e 45 78 74 72 61 20 3d  00 );.  nExtra =
20540 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b   ROUND8(nExtra);
20550 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
20560 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c  Open(szPageDflt,
20570 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c   nExtra, !memDb,
20580 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20590 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65       !memDb?page
205a0 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64  rStress:0, (void
205b0 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67 65   *)pPager, pPage
205c0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20  r->pPCache);..  
205d0 50 41 47 45 52 54 52 41 43 45 28 28 22 4f 50 45  PAGERTRACE(("OPE
205e0 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45  N %d %s\n", FILE
205f0 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d  HANDLEID(pPager-
20600 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46  >fd), pPager->zF
20610 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54  ilename));.  IOT
20620 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25  RACE(("OPEN %p %
20630 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  s\n", pPager, pP
20640 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
20650 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65  )..  pPager->use
20660 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73  Journal = (u8)us
20670 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67  eJournal;.  pPag
20680 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d  er->noReadlock =
20690 20 28 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20   (noReadlock && 
206a0 72 65 61 64 4f 6e 6c 79 29 20 3f 31 3a 30 3b 0a  readOnly) ?1:0;.
206b0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
206c0 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20  tOpen = 0; */.  
206d0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  /* pPager->stmtI
206e0 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nUse = 0; */.  /
206f0 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d  * pPager->nRef =
20700 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
20710 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 28  >dbSizeValid = (
20720 75 38 29 6d 65 6d 44 62 3b 0a 20 20 2f 2a 20 70  u8)memDb;.  /* p
20730 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
20740 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
20750 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
20760 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
20770 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a  er->nPage = 0; *
20780 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  /.  pPager->mxPg
20790 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  no = SQLITE_MAX_
207a0 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a  PAGE_COUNT;.  /*
207b0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
207c0 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a   PAGER_UNLOCK; *
207d0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
207e0 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74 65  er->state == (te
207f0 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52 5f 45  mpFile ? PAGER_E
20800 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47 45 52  XCLUSIVE : PAGER
20810 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f 2a  _UNLOCK) );.  /*
20820 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
20830 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
20840 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75  r->tempFile = (u
20850 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73  8)tempFile;.  as
20860 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d  sert( tempFile==
20870 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
20880 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20  E_NORMAL .      
20890 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d      || tempFile=
208a0 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
208b0 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  DE_EXCLUSIVE );.
208c0 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
208d0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
208e0 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50  USIVE==1 );.  pP
208f0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
20900 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69  ode = (u8)tempFi
20910 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63  le; .  pPager->c
20920 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
20930 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
20940 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d  e;.  pPager->mem
20950 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a  Db = (u8)memDb;.
20960 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e    pPager->readOn
20970 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c  ly = (u8)readOnl
20980 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  y;.  /* pPager->
20990 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f  needSync = 0; */
209a0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
209b0 63 20 3d 20 28 70 50 61 67 65 72 2d 3e 74 65 6d  c = (pPager->tem
209c0 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75  pFile || !useJou
209d0 72 6e 61 6c 29 20 3f 31 3a 30 3b 0a 20 20 70 50  rnal) ?1:0;.  pP
209e0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
209f0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
20a00 3f 30 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ?0:1;.  pPager->
20a10 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c  sync_flags = SQL
20a20 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
20a30 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
20a40 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  irst = 0; */.  /
20a50 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
20a60 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20  Synced = 0; */. 
20a70 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73   /* pPager->pLas
20a80 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  t = 0; */.  pPag
20a90 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31  er->nExtra = (u1
20aa0 36 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67  6)nExtra;.  pPag
20ab0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
20ac0 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45  imit = SQLITE_DE
20ad0 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49  FAULT_JOURNAL_SI
20ae0 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65  ZE_LIMIT;.  asse
20af0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
20b00 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69  r->fd) || tempFi
20b10 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f  le );.  setSecto
20b20 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
20b30 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20   if( memDb ){.  
20b40 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
20b50 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
20b60 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
20b70 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65  ;.  }.  /* pPage
20b80 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20  r->xBusyHandler 
20b90 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
20ba0 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
20bb0 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  rArg = 0; */.  /
20bc0 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d  * memset(pPager-
20bd0 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f  >aHash, 0, sizeo
20be0 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  f(pPager->aHash)
20bf0 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72  ); */.  *ppPager
20c00 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74   = pPager;.  ret
20c10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
20c20 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  ..../*.** This f
20c30 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
20c40 64 20 61 66 74 65 72 20 74 72 61 6e 73 69 74 69  d after transiti
20c50 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52  oning from PAGER
20c60 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41  _UNLOCK to.** PA
20c70 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65  GER_SHARED state
20c80 2e 20 49 74 20 74 65 73 74 73 20 69 66 20 74 68  . It tests if th
20c90 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75  ere is a hot jou
20ca0 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a  rnal present in.
20cb0 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
20cc0 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  em for the given
20cd0 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f   pager. A hot jo
20ce0 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61  urnal is one tha
20cf0 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62  t .** needs to b
20d00 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41  e played back. A
20d10 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73  ccording to this
20d20 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74   function, a hot
20d30 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65  -journal.** file
20d40 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20 66   exists if the f
20d50 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69  ollowing criteri
20d60 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a  a are met:.**.**
20d70 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c     * The journal
20d80 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20   file exists in 
20d90 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c  the file system,
20da0 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70   and.**   * No p
20db0 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52  rocess holds a R
20dc0 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74  ESERVED or great
20dd0 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  er lock on the d
20de0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e  atabase file, an
20df0 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74  d.**   * The dat
20e00 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c  abase file itsel
20e10 66 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  f is greater tha
20e20 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a  n 0 bytes in siz
20e30 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68  e, and.**   * Th
20e40 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
20e50 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
20e60 20 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e   exists and is n
20e70 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49  ot 0x00..**.** I
20e80 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  f the current si
20e90 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
20ea0 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74  se file is 0 but
20eb0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a   a journal file.
20ec0 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20  ** exists, that 
20ed0 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f  is probably an o
20ee0 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20  ld journal left 
20ef0 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f  over from a prio
20f00 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69  r.** database wi
20f10 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
20f20 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
20f30 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
20f40 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74  is.** just delet
20f50 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74  ed using OsDelet
20f60 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73  e, *pExists is s
20f70 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49  et to 0 and SQLI
20f80 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
20f90 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rned..**.** This
20fa0 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
20fb0 74 20 63 68 65 63 6b 20 69 66 20 74 68 65 72 65  t check if there
20fc0 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   is a master jou
20fd0 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a  rnal filename.**
20fe0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
20ff0 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  he file. If ther
21000 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d  e is, and that m
21010 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
21020 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  le.** does not e
21030 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a  xist, then the j
21040 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
21050 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49  ot really hot. I
21060 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74  n this.** case t
21070 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
21080 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d   return a false-
21090 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20 70 61  positive. The pa
210a0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a  ger_playback().*
210b0 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  * routine will d
210c0 69 73 63 6f 76 65 72 20 74 68 61 74 20 74 68 65  iscover that the
210d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
210e0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20   not really hot 
210f0 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  and .** will not
21100 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a   roll it back. .
21110 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a  **.** If a hot-j
21120 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66  ournal file is f
21130 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a  ound to exist, *
21140 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74  pExists is set t
21150 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49  o 1 and .** SQLI
21160 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
21170 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  If no hot-journa
21180 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e  l file is presen
21190 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a  t, *pExists is.*
211a0 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53  * set to 0 and S
211b0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
211c0 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
211d0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
211e0 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65  rying.** to dete
211f0 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
21200 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   not a hot-journ
21210 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
21220 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20  the IO error.** 
21230 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
21240 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
21250 66 20 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e  f *pExists is un
21260 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
21270 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75  ic int hasHotJou
21280 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
21290 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73  er, int *pExists
212a0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
212b0 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
212c0 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
212d0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
212e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
212f0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
21300 20 20 69 6e 74 20 65 78 69 73 74 73 3b 20 20 20    int exists;   
21310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21320 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75  /* True if a jou
21330 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65  rnal file is pre
21340 73 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  sent */..  asser
21350 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
21360 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
21370 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
21380 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
21390 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
213a0 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
213b0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
213c0 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20  ;..  *pExists = 
213d0 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
213e0 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
213f0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
21400 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
21410 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29  EXISTS, &exists)
21420 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
21430 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20  TE_OK && exists 
21440 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65  ){.    int locke
21450 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
21460 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f     /* True if so
21470 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  me process holds
21480 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
21490 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65   */..    /* Race
214a0 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a   condition here:
214b0 20 20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73    Another proces
214c0 73 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65  s might have bee
214d0 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20  n holding the.  
214e0 20 20 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45    ** the RESERVE
214f0 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20  D lock and have 
21500 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61  a journal open a
21510 74 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41  t the sqlite3OsA
21520 63 63 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20  ccess() .    ** 
21530 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20  call above, but 
21540 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20  then delete the 
21550 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70  journal and drop
21560 20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65   the lock before
21570 0a 20 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74  .    ** we get t
21580 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
21590 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65  sqlite3OsCheckRe
215a0 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c  servedLock() cal
215b0 6c 2e 20 20 49 66 20 74 68 61 74 0a 20 20 20 20  l.  If that.    
215c0 2a 2a 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  ** is the case, 
215d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
215e0 68 74 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69  ht think there i
215f0 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  s a hot journal 
21600 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66  when.    ** in f
21610 61 63 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e  act there is non
21620 65 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74 73  e.  This results
21630 20 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69   in a false-posi
21640 74 69 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a  tive which will.
21650 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20      ** be dealt 
21660 77 69 74 68 20 62 79 20 74 68 65 20 70 6c 61 79  with by the play
21670 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54  back routine.  T
21680 69 63 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20  icket #3883..   
21690 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
216a0 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
216b0 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  vedLock(pPager->
216c0 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20  fd, &locked);.  
216d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
216e0 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29  _OK && !locked )
216f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67  {.      int nPag
21700 65 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65  e;..      /* Che
21710 63 6b 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ck the size of t
21720 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
21730 2e 20 49 66 20 69 74 20 63 6f 6e 73 69 73 74 73  . If it consists
21740 20 6f 66 20 30 20 70 61 67 65 73 2c 0a 20 20 20   of 0 pages,.   
21750 20 20 20 2a 2a 20 74 68 65 6e 20 64 65 6c 65 74     ** then delet
21760 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
21770 6c 65 2e 20 53 65 65 20 74 68 65 20 68 65 61 64  le. See the head
21780 65 72 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  er comment above
21790 20 66 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 74   for .      ** t
217a0 68 65 20 72 65 61 73 6f 6e 69 6e 67 20 68 65 72  he reasoning her
217b0 65 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 6f  e.  Delete the o
217c0 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
217d0 66 69 6c 65 20 75 6e 64 65 72 0a 20 20 20 20 20  file under.     
217e0 20 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20 6c   ** a RESERVED l
217f0 6f 63 6b 20 74 6f 20 61 76 6f 69 64 20 72 61 63  ock to avoid rac
21800 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 6e 64  e conditions and
21810 20 74 6f 20 61 76 6f 69 64 20 76 69 6f 6c 61 74   to avoid violat
21820 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 5b 48 33  ing.      ** [H3
21830 33 30 32 30 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a  3020]..      */.
21840 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21850 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
21860 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
21870 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
21880 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21890 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
218a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
218b0 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
218c0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
218d0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
218e0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
218f0 53 45 52 56 45 44 0a 20 20 20 20 20 20 20 20 20  SERVED.         
21900 20 20 20 20 20 20 20 20 7c 7c 20 20 73 71 6c 69          ||  sqli
21910 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
21920 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c  ->fd, RESERVED_L
21930 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  OCK)==SQLITE_OK 
21940 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
21950 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
21960 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
21970 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  urnal, 0);.     
21980 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
21990 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
219a0 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20  GER_SHARED );.  
219b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
219c0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
219d0 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20  ER_SHARED ){.   
219e0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
219f0 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  e3OsUnlock(pPage
21a00 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
21a10 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  CK);.           
21a20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
21a30 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21a40 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
21a50 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
21a60 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
21a70 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
21a80 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74  exists and no ot
21a90 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  her connection h
21aa0 61 73 20 61 20 72 65 73 65 72 76 65 64 0a 20 20  as a reserved.  
21ab0 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72          ** or gr
21ac0 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
21ad0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
21ae0 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20   Now check that 
21af0 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20 20  there is.       
21b00 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f     ** at least o
21b10 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65  ne non-zero byte
21b20 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  s at the start o
21b30 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
21b40 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  le..          **
21b50 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 74 68   If there is, th
21b60 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74  en we consider t
21b70 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62  his journal to b
21b80 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a  e hot. If not, .
21b90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
21ba0 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a  can be ignored..
21bb0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
21bc0 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53         int f = S
21bd0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
21be0 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
21bf0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  MAIN_JOURNAL;.  
21c00 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
21c10 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
21c20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
21c30 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
21c40 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20  f, &f);.        
21c50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21c60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
21c70 20 20 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b     u8 first = 0;
21c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
21c90 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
21ca0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f  pPager->jfd, (vo
21cb0 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20  id *)&first, 1, 
21cc0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
21cd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
21ce0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
21cf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
21d00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21d10 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
21d20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
21d30 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
21d40 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
21d50 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28      *pExists = (
21d60 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20  first!=0);.     
21d70 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
21d80 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  c==SQLITE_CANTOP
21d90 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  EN ){.          
21da0 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f    /* If we canno
21db0 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62  t open the rollb
21dc0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ack journal file
21dd0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65   in order to see
21de0 20 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20   if.            
21df0 2a 2a 20 69 74 73 20 68 61 73 20 61 20 7a 65 72  ** its has a zer
21e00 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d  o header, that m
21e10 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 61  ight be due to a
21e20 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a  n I/O error, or.
21e30 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
21e40 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74  t might be due t
21e50 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69  o the race condi
21e60 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61  tion described a
21e70 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20  bove and in.    
21e80 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65          ** ticke
21e90 74 20 23 33 38 38 33 2e 20 20 45 69 74 68 65 72  t #3883.  Either
21ea0 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61   way, assume tha
21eb0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
21ec0 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20   hot..          
21ed0 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20    ** This might 
21ee0 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74  be a false posit
21ef0 69 76 65 2e 20 20 42 75 74 20 69 66 20 69 74 20  ive.  But if it 
21f00 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  is, then the.   
21f10 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f           ** auto
21f20 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c  matic journal pl
21f30 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76  ayback and recov
21f40 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69  ery mechanism wi
21f50 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20  ll deal.        
21f60 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75      ** with it u
21f70 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56  nder an EXCLUSIV
21f80 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20  E lock where we 
21f90 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20  do not need to. 
21fa0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f             ** wo
21fb0 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68  rry so much with
21fc0 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73   race conditions
21fd0 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
21fe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45  .            *pE
21ff0 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20  xists = 1;.     
22000 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
22010 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
22020 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
22030 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
22040 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22050 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63  /*.** Read the c
22060 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20  ontent for page 
22070 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64  pPg out of the d
22080 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
22090 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70   into .** pPg->p
220a0 44 61 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c  Data. A shared l
220b0 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d  ock or greater m
220c0 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74  ust be held on t
220d0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
220e0 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73 20  ile before this 
220f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
22100 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67  ed..**.** If pag
22110 65 20 31 20 69 73 20 72 65 61 64 2c 20 74 68 65  e 1 is read, the
22120 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  n the value of P
22130 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b  ager.dbFileVers[
22140 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74  ] is set to.** t
22150 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
22160 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
22170 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  file..**.** If a
22180 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
22190 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  s, then the IO e
221a0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
221b0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
221c0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  ** Otherwise, SQ
221d0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
221e0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
221f0 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50 67  nt readDbPage(Pg
22200 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
22210 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
22220 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67  ->pPager; /* Pag
22230 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69  er object associ
22240 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70  ated with page p
22250 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  Pg */.  Pgno pgn
22260 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20  o = pPg->pgno;  
22270 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
22280 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20  ber to read */. 
22290 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
222a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
222b0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
222c0 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b 20 20    i64 iOffset;  
222d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
222e0 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 6f 66  * Byte offset of
222f0 20 66 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72   file to read fr
22300 6f 6d 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  om */..  assert(
22310 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
22320 50 41 47 45 52 5f 53 48 41 52 45 44 20 26 26 20  PAGER_SHARED && 
22330 21 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28  !MEMDB );..  if(
22340 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
22350 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65  >fd) ){.    asse
22360 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  rt( pPager->temp
22370 46 69 6c 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73  File );.    mems
22380 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30  et(pPg->pData, 0
22390 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
223a0 7a 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ze);.    return 
223b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
223c0 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f   iOffset = (pgno
223d0 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
223e0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 72 63 20  >pageSize;.  rc 
223f0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
22400 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d  pPager->fd, pPg-
22410 3e 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  >pData, pPager->
22420 70 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 73 65  pageSize, iOffse
22430 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
22440 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
22450 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 72 63 20  _READ ){.    rc 
22460 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
22470 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29  .  if( pgno==1 )
22480 7b 0a 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65  {.    u8 *dbFile
22490 56 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50  Vers = &((u8*)pP
224a0 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20  g->pData)[24];. 
224b0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
224c0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64  r->dbFileVers, d
224d0 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
224e0 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
224f0 56 65 72 73 29 29 3b 0a 20 20 7d 0a 20 20 43 4f  Vers));.  }.  CO
22500 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 50 67  DEC1(pPager, pPg
22510 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33  ->pData, pgno, 3
22520 2c 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  , rc = SQLITE_NO
22530 4d 45 4d 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49  MEM);..  PAGER_I
22540 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
22550 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b  r_readdb_count);
22560 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50  .  PAGER_INCR(pP
22570 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20  ager->nRead);.  
22580 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20 25  IOTRACE(("PGIN %
22590 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
225a0 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52   pgno));.  PAGER
225b0 54 52 41 43 45 28 28 22 46 45 54 43 48 20 25 64  TRACE(("FETCH %d
225c0 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
225d0 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
225e0 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
225f0 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
22600 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
22610 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  )));..  return r
22620 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
22630 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
22640 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  led to obtain a 
22650 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
22660 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22670 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67  ..** It is illeg
22680 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74  al to call sqlit
22690 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 29  e3PagerAcquire()
226a0 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68 69   until after thi
226b0 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61  s function.** ha
226c0 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75  s been successfu
226d0 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66 20 61  lly called. If a
226e0 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20   shared-lock is 
226f0 61 6c 72 65 61 64 79 20 68 65 6c 64 20 77 68 65  already held whe
22700 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  n.** this functi
22710 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
22720 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
22730 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
22740 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20   operations are 
22750 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64 20 62  also performed b
22760 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
22770 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20 74  .**.**   1) If t
22780 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72 72  he pager is curr
22790 65 6e 74 6c 79 20 69 6e 20 50 41 47 45 52 5f 55  ently in PAGER_U
227a0 4e 4c 4f 43 4b 20 73 74 61 74 65 20 28 6e 6f 20  NLOCK state (no 
227b0 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20 20  lock held.**    
227c0 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73    on the databas
227d0 65 20 66 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e  e file), then an
227e0 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
227f0 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a 20   to obtain a.** 
22800 20 20 20 20 20 53 48 41 52 45 44 20 6c 6f 63 6b       SHARED lock
22810 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
22820 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65   file. Immediate
22830 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69  ly after obtaini
22840 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 53  ng.**      the S
22850 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
22860 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20 63  file-system is c
22870 68 65 63 6b 65 64 20 66 6f 72 20 61 20 68 6f 74  hecked for a hot
22880 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20  -journal,.**    
22890 20 20 77 68 69 63 68 20 69 73 20 70 6c 61 79 65    which is playe
228a0 64 20 62 61 63 6b 20 69 66 20 70 72 65 73 65 6e  d back if presen
228b0 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79  t. Following any
228c0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a   hot-journal .**
228d0 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20        rollback, 
228e0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
228f0 74 68 65 20 63 61 63 68 65 20 61 72 65 20 76 61  the cache are va
22900 6c 69 64 61 74 65 64 20 62 79 20 63 68 65 63 6b  lidated by check
22910 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20  ing.**      the 
22920 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 27  'change-counter'
22930 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 64 61   field of the da
22940 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64  tabase file head
22950 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 64  er and.**      d
22960 69 73 63 61 72 64 65 64 20 69 66 20 74 68 65 79  iscarded if they
22970 20 61 72 65 20 66 6f 75 6e 64 20 74 6f 20 62 65   are found to be
22980 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20   invalid..**.** 
22990 20 20 32 29 20 49 66 20 74 68 65 20 70 61 67 65    2) If the page
229a0 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20  r is running in 
229b0 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20  exclusive-mode, 
229c0 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 63 75  and there are cu
229d0 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20  rrently.**      
229e0 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
229f0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6e 79  eferences to any
22a00 20 70 61 67 65 73 2c 20 61 6e 64 20 69 73 20 69   pages, and is i
22a10 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
22a20 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e 20  e,.**      then 
22a30 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  an attempt is ma
22a40 64 65 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20  de to clear the 
22a50 65 72 72 6f 72 20 73 74 61 74 65 20 62 79 20 64  error state by d
22a60 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20 20  iscarding.**    
22a70 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
22a80 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
22a90 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61 63   and rolling bac
22aa0 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72 6e  k any open journ
22ab0 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 2e  al.**      file.
22ac0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70  .**.** If the op
22ad0 65 72 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65  eration describe
22ae0 64 20 62 79 20 28 32 29 20 61 62 6f 76 65 20 69  d by (2) above i
22af0 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c  s not attempted,
22b00 20 61 6e 64 20 69 66 20 74 68 65 0a 2a 2a 20 70   and if the.** p
22b10 61 67 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72  ager is in an er
22b20 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72 20  ror state other 
22b30 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  than SQLITE_FULL
22b40 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   when this is ca
22b50 6c 6c 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72  lled,.** the err
22b60 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63  or state error c
22b70 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
22b80 20 49 74 20 69 73 20 70 65 72 6d 69 74 74 65 64   It is permitted
22b90 20 74 6f 20 72 65 61 64 20 74 68 65 0a 2a 2a 20   to read the.** 
22ba0 64 61 74 61 62 61 73 65 20 77 68 65 6e 20 69 6e  database when in
22bb0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 65 72 72   SQLITE_FULL err
22bc0 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  or state..**.** 
22bd0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 65 76  Otherwise, if ev
22be0 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
22bf0 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
22c00 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
22c10 66 20 61 6e 0a 2a 2a 20 49 4f 20 65 72 72 6f 72  f an.** IO error
22c20 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6c 6f   occurs while lo
22c30 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  cking the databa
22c40 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  se, checking for
22c50 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a   a hot-journal.*
22c60 2a 20 66 69 6c 65 20 6f 72 20 72 6f 6c 6c 69 6e  * file or rollin
22c70 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  g back a journal
22c80 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20 65 72   file, the IO er
22c90 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
22ca0 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
22cb0 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c  ite3PagerSharedL
22cc0 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
22cd0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
22ce0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
22cf0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
22d00 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
22d10 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 3d 20   isErrorReset = 
22d20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
22d30 2f 2a 20 54 72 75 65 20 69 66 20 72 65 63 6f 76  /* True if recov
22d40 65 72 69 6e 67 20 66 72 6f 6d 20 65 72 72 6f 72  ering from error
22d50 20 73 74 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20   state */..  /* 
22d60 49 66 20 74 68 69 73 20 64 61 74 61 62 61 73 65  If this database
22d70 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
22d80 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e  ing page referen
22d90 63 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 6e  ces and is in an
22da0 20 0a 20 20 2a 2a 20 65 72 72 6f 72 2d 73 74 61   .  ** error-sta
22db0 74 65 2c 20 74 68 69 73 20 69 73 20 61 20 63 68  te, this is a ch
22dc0 61 6e 63 65 20 74 6f 20 63 6c 65 61 72 20 74 68  ance to clear th
22dd0 65 20 65 72 72 6f 72 2e 20 44 69 73 63 61 72 64  e error. Discard
22de0 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f 6e 74 65   the .  ** conte
22df0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
22e00 2d 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 62  -cache and rollb
22e10 61 63 6b 20 61 6e 79 20 68 6f 74 20 6a 6f 75 72  ack any hot jour
22e20 6e 61 6c 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  nal in the.  ** 
22e30 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 20 20 2a  file-system..  *
22e40 2f 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26  /.  if( !MEMDB &
22e50 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
22e60 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
22e70 70 50 43 61 63 68 65 29 3d 3d 30 20 26 26 20 70  pPCache)==0 && p
22e80 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
22e90 7b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  {.    if( isOpen
22ea0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c  (pPager->jfd) ||
22eb0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
22ec0 6c 20 29 7b 0a 20 20 20 20 20 20 69 73 45 72 72  l ){.      isErr
22ed0 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a 20 20 20  orReset = 1;.   
22ee0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65   }.    pPager->e
22ef0 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  rrCode = SQLITE_
22f00 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65  OK;.    pager_re
22f10 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  set(pPager);.  }
22f20 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
22f30 67 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 20  ger is still in 
22f40 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  an error state, 
22f50 64 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 2e 20  do not proceed. 
22f60 54 68 65 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20  The error .  ** 
22f70 73 74 61 74 65 20 77 69 6c 6c 20 62 65 20 63 6c  state will be cl
22f80 65 61 72 65 64 20 61 74 20 73 6f 6d 65 20 70 6f  eared at some po
22f90 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
22fa0 65 20 77 68 65 6e 20 61 6c 6c 20 70 61 67 65 20  e when all page 
22fb0 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  .  ** references
22fc0 20 61 72 65 20 64 72 6f 70 70 65 64 20 61 6e 64   are dropped and
22fd0 20 74 68 65 20 63 61 63 68 65 20 63 61 6e 20 62   the cache can b
22fe0 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20 20 2a  e discarded..  *
22ff0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
23000 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65  errCode && pPage
23010 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
23020 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72  TE_FULL ){.    r
23030 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
23040 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 69 66  rCode;.  }..  if
23050 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
23060 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c  =PAGER_UNLOCK ||
23070 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b   isErrorReset ){
23080 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
23090 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
230a0 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
230b0 20 20 69 6e 74 20 69 73 48 6f 74 4a 6f 75 72 6e    int isHotJourn
230c0 61 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  al = 0;.    asse
230d0 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
230e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
230f0 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
23100 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
23110 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 21  ==0 );.    if( !
23120 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
23130 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ck ){.      rc =
23140 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
23150 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52  ock(pPager, SHAR
23160 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
23170 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23180 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
23190 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
231a0 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
231b0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
231c0 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
231d0 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
231e0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
231f0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
23200 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
23210 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
23220 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
23230 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  RED;.    }.    a
23240 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
23250 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  tate>=SHARED_LOC
23260 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  K );..    /* If 
23270 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  a journal file e
23280 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65  xists, and there
23290 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20   is no RESERVED 
232a0 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
232b0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
232c0 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72  , then it either
232d0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
232e0 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65  yed back or dele
232f0 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
23300 69 66 28 20 21 69 73 45 72 72 6f 72 52 65 73 65  if( !isErrorRese
23310 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
23320 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  hasHotJournal(pP
23330 61 67 65 72 2c 20 26 69 73 48 6f 74 4a 6f 75 72  ager, &isHotJour
23340 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nal);.      if( 
23350 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23360 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61  .        goto fa
23370 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iled;.      }.  
23380 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 45 72    }.    if( isEr
23390 72 6f 72 52 65 73 65 74 20 7c 7c 20 69 73 48 6f  rorReset || isHo
233a0 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  tJournal ){.    
233b0 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c    /* Get an EXCL
233c0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
233d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
233e0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   At this point i
233f0 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d  t is.      ** im
23400 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52  portant that a R
23410 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
23420 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20  not obtained on 
23430 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20  the way to the. 
23440 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56       ** EXCLUSIV
23450 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65  E lock. If it we
23460 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63  re, another proc
23470 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74  ess might open t
23480 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
23490 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63  base file, detec
234a0 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  t the RESERVED l
234b0 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64  ock, and conclud
234c0 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
234d0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
234e0 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69  safe to read whi
234f0 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  le this process 
23500 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67  is still rolling
23510 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68   the .      ** h
23520 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e  ot-journal back.
23530 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20  .      ** .     
23540 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20   ** Because the 
23550 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53  intermediate RES
23560 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
23570 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79  t requested, any
23580 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
23590 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69  process attempti
235a0 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ng to access the
235b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
235c0 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20  ill get to .    
235d0 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20    ** this point 
235e0 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20  in the code and 
235f0 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69  fail to obtain i
23600 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45  ts own EXCLUSIVE
23610 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20   lock .      ** 
23620 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
23630 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  file..      */. 
23640 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
23650 3e 73 74 61 74 65 3c 45 58 43 4c 55 53 49 56 45  >state<EXCLUSIVE
23660 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  _LOCK ){.       
23670 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
23680 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
23690 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
236a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
236b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
236c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
236d0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
236e0 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20   rc);.          
236f0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
23700 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
23710 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
23720 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
23730 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20        }. .      
23740 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
23750 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69  nal for read/wri
23760 74 65 20 61 63 63 65 73 73 2e 20 54 68 69 73 20  te access. This 
23770 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a 20  is because in . 
23780 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76       ** exclusiv
23790 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68  e-access mode th
237a0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
237b0 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f  r will be kept o
237c0 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  pen and.      **
237d0 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66   possibly used f
237e0 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
237f0 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f   later on. On so
23800 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a  me systems, the.
23810 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63        ** OsTrunc
23820 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20  ate() call used 
23830 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
23840 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65  ess mode also re
23850 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20  quires.      ** 
23860 61 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 6c  a read/write fil
23870 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20  e handle..      
23880 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  */.      if( !is
23890 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
238a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ) ){.        int
238b0 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63   res;.        rc
238c0 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
238d0 73 73 28 70 56 66 73 2c 70 50 61 67 65 72 2d 3e  ss(pVfs,pPager->
238e0 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f  zJournal,SQLITE_
238f0 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 26 72  ACCESS_EXISTS,&r
23900 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  es);.        if(
23910 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23920 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
23930 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  res ){.         
23940 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
23950 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
23960 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e   f = SQLITE_OPEN
23970 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
23980 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
23990 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  NAL;.           
239a0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
239b0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
239c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
239d0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
239e0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
239f0 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
23a00 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  , f, &fout);.   
23a10 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
23a20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
23a30 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
23a40 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20  >jfd) );.       
23a50 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
23a60 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53  ITE_OK && fout&S
23a70 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
23a80 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NLY ){.         
23a90 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23aa0 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 20  _CANTOPEN;.     
23ab0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
23ac0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
23ad0 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
23ae0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
23af0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
23b00 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   /* If the journ
23b10 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  al does not exis
23b20 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d 65  t, it usually me
23b30 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a 20  ans that some . 
23b40 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 74             ** ot
23b50 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d  her connection m
23b60 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e  anaged to get in
23b70 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63   and roll it bac
23b80 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20  k before .      
23b90 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f        ** this co
23ba0 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65  nnection obtaine
23bb0 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  d the exclusive 
23bc0 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20  lock above. Or, 
23bd0 69 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  it .            
23be0 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74  ** may mean that
23bf0 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
23c00 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
23c10 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20  e when this.    
23c20 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
23c30 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 61  ion was called a
23c40 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
23c50 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
23c60 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  st.  */.        
23c70 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
23c80 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
23c90 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
23ca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
23cb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
23cc0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
23cd0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
23ce0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
23cf0 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a  ..      /* TODO:
23d00 20 57 68 79 20 61 72 65 20 74 68 65 73 65 20 63   Why are these c
23d10 6c 65 61 72 65 64 20 68 65 72 65 3f 20 49 73 20  leared here? Is 
23d20 69 74 20 6e 65 63 65 73 73 61 72 79 3f 20 2a 2f  it necessary? */
23d30 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
23d40 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
23d50 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
23d60 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
23d70 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
23d80 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
23d90 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
23da0 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20  nalHdr = 0;. .  
23db0 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20      /* Playback 
23dc0 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a  and delete the j
23dd0 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68  ournal.  Drop th
23de0 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65  e database write
23df0 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61  .      ** lock a
23e00 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65  nd reacquire the
23e10 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67   read lock. Purg
23e20 65 20 74 68 65 20 63 61 63 68 65 20 62 65 66 6f  e the cache befo
23e30 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79  re.      ** play
23e40 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74  ing back the hot
23e50 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74  -journal so that
23e60 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70   we don't end up
23e70 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61   with.      ** a
23e80 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63  n inconsistent c
23e90 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ache..      */. 
23ea0 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28       if( isOpen(
23eb0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
23ec0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
23ed0 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
23ee0 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  er, 1);.        
23ef0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23f00 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
23f10 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28  c = pager_error(
23f20 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
23f30 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
23f40 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ed;.        }.  
23f50 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
23f60 72 74 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61  rt( (pPager->sta
23f70 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te==PAGER_SHARED
23f80 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  ).           || 
23f90 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
23fa0 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
23fb0 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48  ->state>PAGER_SH
23fc0 41 52 45 44 29 0a 20 20 20 20 20 20 29 3b 0a 20  ARED).      );. 
23fd0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 50     }..    if( pP
23fe0 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 7c 7c  ager->pBackup ||
23ff0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
24000 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
24010 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20  pPCache)>0 ){.  
24020 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
24030 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20  d-lock has just 
24040 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e  been acquired on
24050 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
24060 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  le.      ** and 
24070 74 68 65 72 65 20 61 72 65 20 61 6c 72 65 61 64  there are alread
24080 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  y pages in the c
24090 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65  ache (from a pre
240a0 76 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 72  vious.      ** r
240b0 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
240c0 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63  nsaction).  Chec
240d0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
240e0 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
240f0 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  * has been modif
24100 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74  ied.  If the dat
24110 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65  abase has change
24120 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20  d, flush the.   
24130 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20     ** cache..   
24140 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44     **.      ** D
24150 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20  atabase changes 
24160 69 73 20 64 65 74 65 63 74 65 64 20 62 79 20 6c  is detected by l
24170 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74  ooking at 15 byt
24180 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20  es beginning.   
24190 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20     ** at offset 
241a0 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  24 into the file
241b0 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20 6f  .  The first 4 o
241c0 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65 73  f these 16 bytes
241d0 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20   are.      ** a 
241e0 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74  32-bit counter t
241f0 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  hat is increment
24200 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68 61  ed with each cha
24210 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  nge.  The.      
24220 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20 63  ** other bytes c
24230 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77  hange randomly w
24240 69 74 68 20 65 61 63 68 20 66 69 6c 65 20 63 68  ith each file ch
24250 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20  ange when.      
24260 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e  ** a codec is in
24270 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a   use..      ** .
24280 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69        ** There i
24290 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20  s a vanishingly 
242a0 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61  small chance tha
242b0 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20  t a change will 
242c0 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a  not be .      **
242d0 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20   detected.  The 
242e0 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64  chance of an und
242f0 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69  etected change i
24300 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a  s so small that.
24310 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20        ** it can 
24320 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20  be neglected..  
24330 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 68 61      */.      cha
24340 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a  r dbFileVers[siz
24350 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
24360 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20 20 20 20  leVers)];.      
24370 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
24380 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29  count(pPager, 0)
24390 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ;..      if( pPa
243a0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
243b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 50 61          rc = pPa
243c0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
243d0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
243e0 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
243f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
24400 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b  ->dbSizeValid );
24410 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
24420 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20  r->dbSize>0 ){. 
24430 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
24440 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22  "CKVERS %p %d\n"
24450 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66  , pPager, sizeof
24460 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a  (dbFileVers)));.
24470 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
24480 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
24490 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65  r->fd, &dbFileVe
244a0 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
244b0 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20  eVers), 24);.   
244c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
244d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
244e0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
244f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24500 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
24510 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72  memset(dbFileVer
24520 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46  s, 0, sizeof(dbF
24530 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
24540 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65   }..      if( me
24550 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46  mcmp(pPager->dbF
24560 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
24570 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
24580 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20  leVers))!=0 ){. 
24590 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
245a0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
245b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
245c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78  sert( pPager->ex
245d0 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
245e0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
245f0 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20  GER_SHARED );.  
24600 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66  }.. failed:.  if
24610 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
24620 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f  ){.    /* pager_
24630 75 6e 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f  unlock() is a no
24640 2d 6f 70 20 66 6f 72 20 65 78 63 6c 75 73 69 76  -op for exclusiv
24650 65 20 6d 6f 64 65 20 61 6e 64 20 69 6e 2d 6d 65  e mode and in-me
24660 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 20  mory databases. 
24670 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c  */.    pager_unl
24680 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ock(pPager);.  }
24690 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
246a0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  ./*.** If the re
246b0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61  ference count ha
246c0 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20  s reached zero, 
246d0 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  rollback any act
246e0 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ive.** transacti
246f0 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  on and unlock th
24700 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45  e pager..**.** E
24710 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e  xcept, in lockin
24720 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45  g_mode=EXCLUSIVE
24730 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   when there is n
24740 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20  othing to in.** 
24750 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
24760 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b  rnal, the unlock
24770 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65   is not performe
24780 64 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a  d and there is.*
24790 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c  * nothing to rol
247a0 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72  lback, so this r
247b0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
247c0 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  p..*/ .static vo
247d0 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  id pagerUnlockIf
247e0 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70 50  Unused(Pager *pP
247f0 61 67 65 72 29 7b 0a 20 20 69 66 28 20 28 73 71  ager){.  if( (sq
24800 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
24810 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
24820 63 68 65 29 3d 3d 30 29 0a 20 20 20 26 26 20 28  che)==0).   && (
24830 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
24840 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  veMode || pPager
24850 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20  ->journalOff>0) 
24860 0a 20 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55  .  ){.    pagerU
24870 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
24880 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a  (pPager);.  }.}.
24890 0a 2f 2a 0a 2a 2a 20 44 72 6f 70 20 61 20 70 61  ./*.** Drop a pa
248a0 67 65 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68  ge from the cach
248b0 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50  e using sqlite3P
248c0 63 61 63 68 65 44 72 6f 70 28 29 2e 0a 2a 2a 0a  cacheDrop()..**.
248d0 2a 2a 20 49 66 20 74 68 69 73 20 6d 65 61 6e 73  ** If this means
248e0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 77 20 6e   there are now n
248f0 6f 20 70 61 67 65 73 20 77 69 74 68 20 72 65 66  o pages with ref
24900 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 6d 2c  erences to them,
24910 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f   a rollback.** o
24920 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f  ccurs and the lo
24930 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
24940 73 65 20 69 73 20 72 65 6d 6f 76 65 64 2e 0a 2a  se is removed..*
24950 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
24960 67 65 72 44 72 6f 70 50 61 67 65 28 44 62 50 61  gerDropPage(DbPa
24970 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  ge *pPg){.  Page
24980 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
24990 3e 70 50 61 67 65 72 3b 0a 20 20 73 71 6c 69 74  >pPager;.  sqlit
249a0 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67  e3PcacheDrop(pPg
249b0 29 3b 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  );.  pagerUnlock
249c0 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29  IfUnused(pPager)
249d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
249e0 72 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  re a reference t
249f0 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67  o page number pg
24a00 6e 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61 67  no in pager pPag
24a10 65 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72 65  er (a page.** re
24a20 66 65 72 65 6e 63 65 20 68 61 73 20 74 79 70 65  ference has type
24a30 20 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74 68   DbPage*). If th
24a40 65 20 72 65 71 75 65 73 74 65 64 20 72 65 66 65  e requested refe
24a50 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63  rence is .** suc
24a60 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e  cessfully obtain
24a70 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64  ed, it is copied
24a80 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20   to *ppPage and 
24a90 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
24aa0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
24ab0 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
24ac0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
24ad0 65 20 63 61 63 68 65 2c 20 69 74 20 69 73 20 72  e cache, it is r
24ae0 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68  eturned. .** Oth
24af0 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61  erwise, a new pa
24b00 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c  ge object is all
24b10 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c  ocated and popul
24b20 61 74 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a  ated with data.*
24b30 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  * read from the 
24b40 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
24b50 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68  n some cases, th
24b60 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20  e pcache module 
24b70 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f  may.** choose no
24b80 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20  t to allocate a 
24b90 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20  new page object 
24ba0 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e  and may reuse an
24bb0 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a   existing.** obj
24bc0 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73  ect with no outs
24bd0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
24be0 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78  es..**.** The ex
24bf0 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65  tra data appende
24c00 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61  d to a page is a
24c10 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65  lways initialize
24c20 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a  d to zeros the .
24c30 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61 20  ** first time a 
24c40 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69  page is loaded i
24c50 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74  nto memory. If t
24c60 68 65 20 70 61 67 65 20 72 65 71 75 65 73 74 65  he page requeste
24c70 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79  d is .** already
24c80 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 77 68   in the cache wh
24c90 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
24ca0 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e   is called, then
24cb0 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61   the extra.** da
24cc0 74 61 20 69 73 20 6c 65 66 74 20 61 73 20 69 74  ta is left as it
24cd0 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 70 61   was when the pa
24ce0 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61  ge object was la
24cf0 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  st used..**.** I
24d00 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
24d10 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20  mage is smaller 
24d20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
24d30 65 64 20 70 61 67 65 20 6f 72 20 69 66 20 61 20  ed page or if a 
24d40 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  .** non-zero val
24d50 75 65 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ue is passed as 
24d60 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61  the noContent pa
24d70 72 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65 20  rameter and the 
24d80 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70 61  .** requested pa
24d90 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
24da0 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  y stored in the 
24db0 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a  cache, then no .
24dc0 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72  ** actual disk r
24dd0 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74  ead occurs. In t
24de0 68 69 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d  his case the mem
24df0 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
24e00 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69   .** page is ini
24e10 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20  tialized to all 
24e20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  zeros. .**.** If
24e30 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72   noContent is tr
24e40 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ue, it means tha
24e50 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
24e60 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65   about the conte
24e70 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  nts.** of the pa
24e80 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20  ge. This occurs 
24e90 69 6e 20 74 77 6f 20 73 65 70 65 72 61 74 65 20  in two seperate 
24ea0 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a  scenarios:.**.**
24eb0 20 20 20 61 29 20 57 68 65 6e 20 72 65 61 64 69     a) When readi
24ec0 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  ng a free-list l
24ed0 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68  eaf page from th
24ee0 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a  e database, and.
24ef0 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20  **.**   b) When 
24f00 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62  a savepoint is b
24f10 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
24f20 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20   and we need to 
24f30 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e  load.**      a n
24f40 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ew page into the
24f50 20 63 61 63 68 65 20 74 6f 20 70 6f 70 75 6c 61   cache to popula
24f60 74 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  te with the data
24f70 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72   read.**      fr
24f80 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  om the savepoint
24f90 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
24fa0 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20  If noContent is 
24fb0 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64  true, then the d
24fc0 61 74 61 20 72 65 74 75 72 6e 65 64 20 69 73 20  ata returned is 
24fd0 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f  zeroed instead o
24fe0 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20  f.** being read 
24ff0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
25000 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  e. Additionally,
25010 20 74 68 65 20 62 69 74 73 20 63 6f 72 72 65 73   the bits corres
25020 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67  ponding.** to pg
25030 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a  no in Pager.pInJ
25040 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f  ournal (bitvec o
25050 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  f pages already 
25060 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a  written to the.*
25070 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  * journal file) 
25080 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76  and the PagerSav
25090 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
250a0 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20 61  int bitvecs of a
250b0 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70  ny open.** savep
250c0 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54  oints are set. T
250d0 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65  his means if the
250e0 20 70 61 67 65 20 69 73 20 6d 61 64 65 20 77 72   page is made wr
250f0 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a  itable at any.**
25100 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
25110 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61  ture, using a ca
25120 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
25130 65 72 57 72 69 74 65 28 29 2c 20 69 74 73 20 63  erWrite(), its c
25140 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20  ontents.** will 
25150 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64  not be journaled
25160 2e 20 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e  . This saves IO.
25170 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69  .**.** The acqui
25180 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69  sition might fai
25190 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65  l for several re
251a0 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63  asons.  In all c
251b0 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72  ases,.** an appr
251c0 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
251d0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
251e0 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  nd *ppPage is se
251f0 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
25200 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
25210 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20  3PagerLookup(). 
25220 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69   Both this routi
25230 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20  ne and Lookup() 
25240 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69  attempt.** to fi
25250 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
25260 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
25270 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20   first.  If the 
25280 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
25290 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  ady.** in memory
252a0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67  , this routine g
252b0 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72  oes to disk to r
252c0 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61  ead it in wherea
252d0 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75  s Lookup().** ju
252e0 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54  st returns 0.  T
252f0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75  his routine acqu
25300 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
25310 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
25320 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20  it.** has to go 
25330 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75  to disk, and cou
25340 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b  ld also playback
25350 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
25360 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
25370 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20   Since Lookup() 
25380 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69  never goes to di
25390 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73  sk, it never has
253a0 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f   to deal with lo
253b0 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61  cks.** or journa
253c0 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20  l files..*/.int 
253d0 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
253e0 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ire(.  Pager *pP
253f0 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
25400 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
25410 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
25420 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
25430 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
25440 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
25450 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
25460 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
25470 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
25480 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
25490 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  */.  int noConte
254a0 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  nt       /* Do n
254b0 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e  ot bother readin
254c0 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  g content from d
254d0 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  isk if true */.)
254e0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
254f0 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73  Hdr *pPg;..  ass
25500 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
25510 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
25520 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
25530 67 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52  ger->state>PAGER
25540 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66  _UNLOCK );..  if
25550 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  ( pgno==0 ){.   
25560 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
25570 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
25580 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
25590 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72  ger is in the er
255a0 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75 72  ror state, retur
255b0 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64  n an error immed
255c0 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74  iately. .  ** Ot
255d0 68 65 72 77 69 73 65 2c 20 72 65 71 75 65 73 74  herwise, request
255e0 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
255f0 68 65 20 50 43 61 63 68 65 20 6c 61 79 65 72 2e  he PCache layer.
25600 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
25610 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
25620 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
25630 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
25640 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d  FULL ){.    rc =
25650 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
25660 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
25670 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  c = sqlite3Pcach
25680 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70  eFetch(pPager->p
25690 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c  PCache, pgno, 1,
256a0 20 70 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20   ppPage);.  }.. 
256b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
256c0 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74  OK ){.    /* Eit
256d0 68 65 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  her the call to 
256e0 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
256f0 63 68 28 29 20 72 65 74 75 72 6e 65 64 20 61 6e  ch() returned an
25700 20 65 72 72 6f 72 20 6f 72 20 74 68 65 0a 20 20   error or the.  
25710 20 20 2a 2a 20 70 61 67 65 72 20 77 61 73 20 61    ** pager was a
25720 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72  lready in the er
25730 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74  ror-state when t
25740 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  his function was
25750 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20   called..    ** 
25760 53 65 74 20 70 50 67 20 74 6f 20 30 20 61 6e 64  Set pPg to 0 and
25770 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 78 63   jump to the exc
25780 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20  eption handler. 
25790 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 30 3b   */.    pPg = 0;
257a0 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f  .    goto pager_
257b0 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d  acquire_err;.  }
257c0 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50  .  assert( (*ppP
257d0 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f  age)->pgno==pgno
257e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a   );.  assert( (*
257f0 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d  ppPage)->pPager=
25800 3d 70 50 61 67 65 72 20 7c 7c 20 28 2a 70 70 50  =pPager || (*ppP
25810 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 30 20  age)->pPager==0 
25820 29 3b 0a 0a 20 20 69 66 28 20 28 2a 70 70 50 61  );..  if( (*ppPa
25830 67 65 29 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20  ge)->pPager ){. 
25840 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
25850 73 65 20 74 68 65 20 70 63 61 63 68 65 20 61 6c  se the pcache al
25860 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61  ready contains a
25870 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f  n initialized co
25880 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  py of.    ** the
25890 20 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69   page. Return wi
258a0 74 68 6f 75 74 20 66 75 72 74 68 65 72 20 61 64  thout further ad
258b0 6f 2e 20 20 2a 2f 0a 20 20 20 20 50 41 47 45 52  o.  */.    PAGER
258c0 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48  _INCR(pPager->nH
258d0 69 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  it);.    return 
258e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65  SQLITE_OK;..  }e
258f0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
25900 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73 20  pager cache has 
25910 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70 61  created a new pa
25920 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20  ge. Its content 
25930 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a  needs to .    **
25940 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
25950 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61    */.    int nMa
25960 78 3b 0a 0a 20 20 20 20 50 41 47 45 52 5f 49 4e  x;..    PAGER_IN
25970 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73  CR(pPager->nMiss
25980 29 3b 0a 20 20 20 20 70 50 67 20 3d 20 2a 70 70  );.    pPg = *pp
25990 50 61 67 65 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Page;.    pPg->p
259a0 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
259b0 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69  .    /* The maxi
259c0 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20  mum page number 
259d0 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20  is 2^31. Return 
259e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
259f0 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  f a page.    ** 
25a00 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
25a10 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74 68 65  han this, or the
25a20 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d   unused locking-
25a30 70 61 67 65 2c 20 69 73 20 72 65 71 75 65 73 74  page, is request
25a40 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
25a50 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47  gno>PAGER_MAX_PG
25a60 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  NO || pgno==PAGE
25a70 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
25a80 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
25a90 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
25aa0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
25ab0 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
25ac0 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  r;.    }..    rc
25ad0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
25ae0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
25af0 20 26 6e 4d 61 78 29 3b 0a 20 20 20 20 69 66 28   &nMax);.    if(
25b00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
25b10 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
25b20 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
25b30 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6e      }..    if( n
25b40 4d 61 78 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c  Max<(int)pgno ||
25b50 20 4d 45 4d 44 42 20 7c 7c 20 6e 6f 43 6f 6e 74   MEMDB || noCont
25b60 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ent ){.      if(
25b70 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78   pgno>pPager->mx
25b80 50 67 6e 6f 20 29 7b 0a 09 72 63 20 3d 20 53 51  Pgno ){..rc = SQ
25b90 4c 49 54 45 5f 46 55 4c 4c 3b 0a 09 67 6f 74 6f  LITE_FULL;..goto
25ba0 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
25bb0 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
25bc0 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20    if( noContent 
25bd0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61  ){.        /* Fa
25be0 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68 65  ilure to set the
25bf0 20 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a   bits in the InJ
25c00 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f  ournal bit-vecto
25c10 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20  rs is benign..  
25c20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65        ** It mere
25c30 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  ly means that we
25c40 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65   might do some e
25c50 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75  xtra work to jou
25c60 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20  rnal a .        
25c70 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f 65  ** page that doe
25c80 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
25c90 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76   journaled.  Nev
25ca0 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75  ertheless, be su
25cb0 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  re .        ** t
25cc0 6f 20 74 65 73 74 20 74 68 65 20 63 61 73 65 20  o test the case 
25cd0 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65  where a malloc e
25ce0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
25cf0 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20  e trying to set 
25d00 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69  .        ** a bi
25d10 74 20 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f  t in a bit vecto
25d20 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  r..        */.  
25d30 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
25d40 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
25d50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67  ;.        if( pg
25d60 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  no<=pPager->dbOr
25d70 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  igSize ){.      
25d80 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63      TESTONLY( rc
25d90 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74 76   = ) sqlite3Bitv
25da0 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49  ecSet(pPager->pI
25db0 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b  nJournal, pgno);
25dc0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
25dd0 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
25de0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
25df0 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f   }.        TESTO
25e00 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64 54  NLY( rc = ) addT
25e10 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
25e20 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  s(pPager, pgno);
25e30 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
25e40 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
25e50 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73  MEM );.        s
25e60 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
25e70 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d  alloc();.      }
25e80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65  else{.        me
25e90 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c  mset(pPg->pData,
25ea0 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
25eb0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
25ec0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a       IOTRACE(("Z
25ed0 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  ERO %p %d\n", pP
25ee0 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
25ef0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
25f00 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
25f10 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
25f20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50      rc = readDbP
25f30 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
25f40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
25f50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67  K ){.        pag
25f60 65 72 44 72 6f 70 50 61 67 65 28 70 50 67 29 3b  erDropPage(pPg);
25f70 0a 09 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20  ..pPg = 0;.     
25f80 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
25f90 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
25fa0 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20   }.    }.#ifdef 
25fb0 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
25fc0 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
25fd0 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
25fe0 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
25ff0 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  if.  }..  return
26000 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67   SQLITE_OK;..pag
26010 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a  er_acquire_err:.
26020 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
26030 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c  LITE_OK );.  sql
26040 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
26050 50 67 29 3b 0a 20 20 70 61 67 65 72 55 6e 6c 6f  Pg);.  pagerUnlo
26060 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
26070 72 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20  r);.  *ppPage = 
26080 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
26090 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
260a0 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73   a page if it is
260b0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
260c0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
260d0 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64    Do.** not read
260e0 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64   the page from d
260f0 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70  isk.  Return a p
26100 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
26110 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74  ge,.** or 0 if t
26120 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
26130 6e 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 20 72  n cache. Also, r
26140 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 0a  eturn 0 if the .
26150 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20 50  ** pager is in P
26160 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74  AGER_UNLOCK stat
26170 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
26180 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a  tion is called,.
26190 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 70 61 67  ** or if the pag
261a0 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f  er is in an erro
261b0 72 20 73 74 61 74 65 20 6f 74 68 65 72 20 74 68  r state other th
261c0 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 0a  an SQLITE_FULL..
261d0 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
261e0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
261f0 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  .  The differenc
26200 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
26210 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71  outine.** and sq
26220 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
26230 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77  is that _get() w
26240 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69  ill go to the di
26250 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69  sk and read.** i
26260 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68  n the page if th
26270 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
26280 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20  ready in cache. 
26290 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
262a0 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
262b0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
262c0 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20   in cache or if 
262d0 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72  a disk I/O error
262e0 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61   .** has ever ha
262f0 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67  ppened..*/.DbPag
26300 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c  e *sqlite3PagerL
26310 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
26320 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
26330 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
26340 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  0;.  assert( pPa
26350 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
26360 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a  rt( pgno!=0 );..
26370 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 73    if( (pPager->s
26380 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
26390 43 4b 29 0a 20 20 20 26 26 20 28 70 50 61 67 65  CK).   && (pPage
263a0 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
263b0 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
263c0 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
263d0 5f 46 55 4c 4c 29 0a 20 20 29 7b 0a 20 20 20 20  _FULL).  ){.    
263e0 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
263f0 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
26400 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50  he, pgno, 0, &pP
26410 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  g);.  }..  retur
26420 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n pPg;.}../*.** 
26430 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 20 72  Release a page r
26440 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  eference..**.** 
26450 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
26460 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
26470 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20  he page drop to 
26480 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a  zero, then the.*
26490 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20  * page is added 
264a0 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e  to the LRU list.
264b0 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72    When all refer
264c0 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67  ences to all pag
264d0 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73  es.** are releas
264e0 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  ed, a rollback o
264f0 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f  ccurs and the lo
26500 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
26510 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64  se is.** removed
26520 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
26530 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61  3PagerUnref(DbPa
26540 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  ge *pPg){.  if( 
26550 70 50 67 20 29 7b 0a 20 20 20 20 50 61 67 65 72  pPg ){.    Pager
26560 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
26570 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69  pPager;.    sqli
26580 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65  te3PcacheRelease
26590 28 70 50 67 29 3b 0a 20 20 20 20 70 61 67 65 72  (pPg);.    pager
265a0 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70  UnlockIfUnused(p
265b0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Pager);.  }.}../
265c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e  *.** If the main
265d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
265e0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  s already been o
265f0 70 65 6e 65 64 2c 20 65 6e 73 75 72 65 20 74 68  pened, ensure th
26600 61 74 20 74 68 65 0a 2a 2a 20 73 75 62 2d 6a 6f  at the.** sub-jo
26610 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
26620 65 6e 20 74 6f 6f 2e 20 49 66 20 74 68 65 20 6d  en too. If the m
26630 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  ain journal is n
26640 6f 74 20 6f 70 65 6e 2c 0a 2a 2a 20 74 68 69 73  ot open,.** this
26650 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
26660 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  o-op..**.** SQLI
26670 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
26680 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  d if everything 
26690 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74  goes according t
266a0 6f 20 70 6c 61 6e 2e 20 0a 2a 2a 20 41 6e 20 53  o plan. .** An S
266b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
266c0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
266d0 74 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c  turned if a call
266e0 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f   to .** sqlite3O
266f0 73 4f 70 65 6e 28 29 20 66 61 69 6c 73 2e 0a 2a  sOpen() fails..*
26700 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
26710 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65  nSubJournal(Page
26720 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
26730 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
26740 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  ;.  if( isOpen(p
26750 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21  Pager->jfd) && !
26760 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
26770 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20  jfd) ){.    if( 
26780 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
26790 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
267a0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c  ALMODE_MEMORY ||
267b0 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d   pPager->subjInM
267c0 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 73  emory ){.      s
267d0 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
267e0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
267f0 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
26800 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f       rc = pagerO
26810 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20  pentemp(pPager, 
26820 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51  pPager->sjfd, SQ
26830 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
26840 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  RNAL);.    }.  }
26850 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26860 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
26870 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
26880 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
26890 76 65 72 79 20 77 72 69 74 65 20 74 72 61 6e 73  very write trans
268a0 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65  action..** There
268b0 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62 65   must already be
268c0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
268d0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
268e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
268f0 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  * file when this
26900 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
26910 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74  ed..**.** Open t
26920 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
26930 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72  for pager pPager
26940 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75   and write a jou
26950 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74  rnal header.** t
26960 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69  o the start of i
26970 74 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  t. If there are 
26980 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
26990 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d  s, open the sub-
269a0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65  journal.** as we
269b0 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ll. This functio
269c0 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77  n is only used w
269d0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
269e0 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a  file is being .*
269f0 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74  * opened to writ
26a00 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67  e a rollback log
26a10 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
26a20 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73  on. It is not us
26a30 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e  ed .** when open
26a40 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  ing a hot journa
26a50 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69  l file to roll i
26a60 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  t back..**.** If
26a70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
26a80 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  e is already ope
26a90 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  n (as it may be 
26aa0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
26ab0 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73  e),.** then this
26ac0 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77   function just w
26ad0 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20  rites a journal 
26ae0 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 73 74  header to the st
26af0 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c  art of the.** al
26b00 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e  ready open file.
26b10 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20   .**.** Whether 
26b20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e  or not the journ
26b30 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  al file is opene
26b40 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
26b50 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72  on, the.** Pager
26b60 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76  .pInJournal bitv
26b70 65 63 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ec structure is 
26b80 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  allocated..**.**
26b90 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
26ba0 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
26bb0 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f  is successful. O
26bc0 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
26bd0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   .** SQLITE_NOME
26be0 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74  M if the attempt
26bf0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67   to allocate Pag
26c00 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61  er.pInJournal fa
26c10 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49  ils, or .** an I
26c20 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  O error code if 
26c30 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69  opening or writi
26c40 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
26c50 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  ile fails..*/.st
26c60 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f  atic int pager_o
26c70 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65  pen_journal(Page
26c80 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
26c90 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
26ca0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
26cc0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  rn code */.  sql
26cd0 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
26ce0 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
26cf0 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c  pVfs;   /* Local
26d00 20 63 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f   cache of vfs po
26d10 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  inter */..  asse
26d20 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
26d30 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
26d40 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
26d50 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
26d60 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
26d70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
26d80 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  l==0 );.  .  /* 
26d90 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  If already in th
26da0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74  e error state, t
26db0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
26dc0 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66  a no-op. */.  if
26dd0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
26de0 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
26df0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
26e00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a  .  }..  /* TODO:
26e10 20 49 73 20 69 74 20 72 65 61 6c 6c 79 20 70 6f   Is it really po
26e20 73 73 69 62 6c 65 20 74 6f 20 67 65 74 20 68 65  ssible to get he
26e30 72 65 20 77 69 74 68 20 64 62 53 69 7a 65 56 61  re with dbSizeVa
26e40 6c 69 64 3d 3d 30 3f 20 49 66 20 6e 6f 74 2c 0a  lid==0? If not,.
26e50 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 74 6f    ** the call to
26e60 20 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   PagerPagecount(
26e70 29 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64  ) can be removed
26e80 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ..  */.  testcas
26e90 65 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  e( pPager->dbSiz
26ea0 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 73  eValid==0 );.  s
26eb0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
26ec0 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b  ount(pPager, 0);
26ed0 0a 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ..  pPager->pInJ
26ee0 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
26ef0 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61  BitvecCreate(pPa
26f00 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
26f10 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  if( pPager->pInJ
26f20 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ournal==0 ){.   
26f30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
26f40 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OMEM;.  }..  /* 
26f50 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
26f60 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e   file if it is n
26f70 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e  ot already open.
26f80 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65   */.  if( !isOpe
26f90 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
26fa0 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
26fb0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
26fc0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
26fd0 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
26fe0 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e   sqlite3MemJourn
26ff0 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  alOpen(pPager->j
27000 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  fd);.    }else{.
27010 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
27020 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20 20  flags =         
27030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53            /* VFS
27040 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a   flags to open j
27050 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
27060 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
27070 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
27080 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
27090 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72  .        (pPager
270a0 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20  ->tempFile ? .  
270b0 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
270c0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
270d0 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  SE|SQLITE_OPEN_T
270e0 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20  EMP_JOURNAL):.  
270f0 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
27100 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
27110 4c 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 69  L).        );.#i
27120 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
27130 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
27140 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
27150 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20  e3JournalOpen(. 
27160 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70           pVfs, p
27170 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
27180 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c   pPager->jfd, fl
27190 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53  ags, jrnlBufferS
271a0 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20 20  ize(pPager).    
271b0 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20    );.#else.     
271c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
271d0 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
271e0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
271f0 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
27200 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  0);.#endif.    }
27210 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
27220 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
27230 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
27240 29 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  ) );.  }...  /* 
27250 57 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20  Write the first 
27260 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
27270 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
27280 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 2a  le and open .  *
27290 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
272a0 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
272b0 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
272c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
272d0 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69  /* TODO: Check i
272e0 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61  f all of these a
272f0 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72  re really requir
27300 65 64 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  ed. */.    pPage
27310 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20  r->dbOrigSize = 
27320 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
27330 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
27340 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
27350 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
27360 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  Sync = 0;.    pP
27370 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
27380 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
27390 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
273a0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
273b0 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  r = 0;.    pPage
273c0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
273d0 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74  0;.    rc = writ
273e0 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
273f0 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  er);.  }.  if( r
27400 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
27410 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
27420 6e 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f  nt ){.    rc = o
27430 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50  penSubJournal(pP
27440 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  ager);.  }..  if
27450 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
27460 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
27470 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
27480 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
27490 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
274a0 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d  Journal = 0;.  }
274b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
274c0 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77  ./*.** Begin a w
274d0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
274e0 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
274f0 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  d pager object. 
27500 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74  If a .** write-t
27510 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
27520 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e  lready been open
27530 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
27540 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
27550 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61  .** If the exFla
27560 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61  g argument is fa
27570 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72  lse, then acquir
27580 65 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  e at least a RES
27590 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e  ERVED.** lock on
275a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
275b0 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73  le. If exFlag is
275c0 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71 75   true, then acqu
275d0 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20  ire at least.** 
275e0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
275f0 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  k. If such a loc
27600 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
27610 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a  d, no locking .*
27620 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64  * functions need
27630 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   be called..**.*
27640 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  * If this is not
27650 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
27660 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 61  in-memory file a
27670 6e 64 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nd, the journal 
27680 66 69 6c 65 20 69 73 20 0a 2a 2a 20 6f 70 65 6e  file is .** open
27690 65 64 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74  ed if it has not
276a0 20 62 65 65 6e 20 61 6c 72 65 61 64 79 2e 20 46   been already. F
276b0 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  or a temporary f
276c0 69 6c 65 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67  ile, the opening
276d0 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 75 72   .** of the jour
276e0 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65  nal file is defe
276f0 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65  rred until there
27700 20 69 73 20 61 6e 20 61 63 74 75 61 6c 20 6e 65   is an actual ne
27710 65 64 20 74 6f 20 0a 2a 2a 20 77 72 69 74 65 20  ed to .** write 
27720 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  to the journal. 
27730 54 4f 44 4f 3a 20 57 68 79 20 68 61 6e 64 6c 65  TODO: Why handle
27740 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
27750 20 64 69 66 66 65 72 65 6e 74 6c 79 3f 0a 2a 2a   differently?.**
27760 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
27770 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  al file is opene
27780 64 20 28 6f 72 20 69 66 20 69 74 20 69 73 20 61  d (or if it is a
27790 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 20 74 68  lready open), th
277a0 65 6e 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 2d  en a.** journal-
277b0 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
277c0 6e 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  n to the start o
277d0 66 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  f it..**.** If t
277e0 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  he subjInMemory 
277f0 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d  argument is non-
27800 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73  zero, then any s
27810 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65  ub-journal opene
27820 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73  d.** within this
27830 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
27840 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61  l be opened as a
27850 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  n in-memory file
27860 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f  . This.** has no
27870 20 65 66 66 65 63 74 20 69 66 20 74 68 65 20 73   effect if the s
27880 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c  ub-journal is al
27890 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73  ready opened (as
278a0 20 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a   it may be when.
278b0 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  ** running in ex
278c0 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72  clusive mode) or
278d0 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   if the transact
278e0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  ion does not req
278f0 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f  uire a.** sub-jo
27900 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75  urnal. If the su
27910 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d  bjInMemory argum
27920 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65  ent is zero, the
27930 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a  n any required.*
27940 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  * sub-journal is
27950 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d   implemented in-
27960 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72  memory if pPager
27970 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
27980 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f   database, .** o
27990 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72  r using a tempor
279a0 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69  ary file otherwi
279b0 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
279c0 65 33 50 61 67 65 72 42 65 67 69 6e 28 50 61 67  e3PagerBegin(Pag
279d0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
279e0 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a  exFlag, int subj
279f0 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74  InMemory){.  int
27a00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
27a10 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
27a20 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
27a30 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 70 50 61 67  UNLOCK );.  pPag
27a40 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  er->subjInMemory
27a50 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d   = (u8)subjInMem
27a60 6f 72 79 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ory;.  if( pPage
27a70 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
27a80 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73  SHARED ){.    as
27a90 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
27aa0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
27ab0 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
27ac0 42 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  B && !pPager->te
27ad0 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 20 20 2f  mpFile );..    /
27ae0 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45 52  * Obtain a RESER
27af0 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
27b00 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
27b10 66 20 74 68 65 20 65 78 46 6c 61 67 20 70 61 72  f the exFlag par
27b20 61 6d 65 74 65 72 0a 20 20 20 20 2a 2a 20 69 73  ameter.    ** is
27b30 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65   true, then imme
27b40 64 69 61 74 65 6c 79 20 75 70 67 72 61 64 65 20  diately upgrade 
27b50 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55  this to an EXCLU
27b60 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20  SIVE lock. The. 
27b70 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c     ** busy-handl
27b80 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20  er callback can 
27b90 62 65 20 75 73 65 64 20 77 68 65 6e 20 75 70 67  be used when upg
27ba0 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58  rading to the EX
27bb0 43 4c 55 53 49 56 45 0a 20 20 20 20 2a 2a 20 6c  CLUSIVE.    ** l
27bc0 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65  ock, but not whe
27bd0 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20  n obtaining the 
27be0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20  RESERVED lock.. 
27bf0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
27c00 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
27c10 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45  ger->fd, RESERVE
27c20 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
27c30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
27c40 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
27c50 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  state = PAGER_RE
27c60 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 69 66  SERVED;.      if
27c70 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20  ( exFlag ){.    
27c80 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
27c90 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
27ca0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
27cb0 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
27cc0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
27cd0 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
27ce0 20 77 65 72 65 20 73 75 63 63 65 73 73 66 75 6c   were successful
27cf0 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 6f 70 65  ly obtained, ope
27d00 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  n the journal.  
27d10 20 20 2a 2a 20 66 69 6c 65 20 61 6e 64 20 77 72    ** file and wr
27d20 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f  ite the first jo
27d30 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 74 6f 20  urnal-header to 
27d40 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  it..    */.    i
27d50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27d60 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a   && pPager->useJ
27d70 6f 75 72 6e 61 6c 0a 20 20 20 20 20 26 26 20 70  ournal.     && p
27d80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
27d90 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
27da0 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 29  LMODE_OFF .    )
27db0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
27dc0 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
27dd0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
27de0 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65   }else if( isOpe
27df0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
27e00 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
27e10 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  lOff==0 ){.    /
27e20 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77  * This happens w
27e30 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 77 61  hen the pager wa
27e40 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  s in exclusive-a
27e50 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 6c  ccess mode the l
27e60 61 73 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20  ast.    ** time 
27e70 61 20 28 72 65 61 64 20 6f 72 20 77 72 69 74 65  a (read or write
27e80 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  ) transaction wa
27e90 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
27ea0 6f 6e 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20  oncluded.    ** 
27eb0 62 79 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  by this connecti
27ec0 6f 6e 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64  on. Instead of d
27ed0 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f 75 72  eleting the jour
27ee0 6e 61 6c 20 66 69 6c 65 20 69 74 20 77 61 73 20  nal file it was 
27ef0 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65  .    ** kept ope
27f00 6e 20 61 6e 64 20 65 69 74 68 65 72 20 77 61 73  n and either was
27f10 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 30 20   truncated to 0 
27f20 62 79 74 65 73 20 6f 72 20 69 74 73 20 68 65 61  bytes or its hea
27f30 64 65 72 20 77 61 73 0a 20 20 20 20 2a 2a 20 6f  der was.    ** o
27f40 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20  verwritten with 
27f50 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  zeros..    */.  
27f60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
27f70 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20  ->nRec==0 );.   
27f80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
27f90 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29  >dbOrigSize==0 )
27fa0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
27fb0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
27fc0 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
27fd0 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
27fe0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  al(pPager);.  }.
27ff0 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
28000 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e  TRANSACTION %d\n
28010 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
28020 72 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r)));.  assert( 
28030 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
28040 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  jfd) || pPager->
28050 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20  journalOff>0 || 
28060 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
28070 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
28080 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
28090 72 74 28 20 21 70 50 61 67 65 72 2d 3e 64 62 4d  rt( !pPager->dbM
280a0 6f 64 69 66 69 65 64 20 29 3b 0a 20 20 20 20 2f  odified );.    /
280b0 2a 20 49 67 6e 6f 72 65 20 61 6e 79 20 49 4f 20  * Ignore any IO 
280c0 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72  error that occur
280d0 73 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 65  s within pager_e
280e0 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 29  nd_transaction()
280f0 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 75 72  . The.    ** pur
28100 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63 61 6c  pose of this cal
28110 6c 20 69 73 20 74 6f 20 72 65 73 65 74 20 74 68  l is to reset th
28120 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
28130 20 6f 66 20 74 68 65 20 70 61 67 65 72 0a 20 20   of the pager.  
28140 20 20 2a 2a 20 73 75 62 2d 73 79 73 74 65 6d 2e    ** sub-system.
28150 20 49 74 20 64 6f 65 73 6e 27 74 20 6d 61 74 74   It doesn't matt
28160 65 72 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  er if the journa
28170 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 72  l-file is not pr
28180 6f 70 65 72 6c 79 0a 20 20 20 20 2a 2a 20 66 69  operly.    ** fi
28190 6e 61 6c 69 7a 65 64 20 61 74 20 74 68 69 73 20  nalized at this 
281a0 70 6f 69 6e 74 20 28 73 69 6e 63 65 20 69 74 20  point (since it 
281b0 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 6a  is not a valid j
281c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 79 77  ournal file anyw
281d0 61 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ay)..    */.    
281e0 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
281f0 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 29  ction(pPager, 0)
28200 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
28210 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  c;.}../*.** Mark
28220 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20 70   a single data p
28230 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
28240 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72  . The page is wr
28250 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a  itten into the .
28260 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  ** main journal 
28270 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61  or sub-journal a
28280 73 20 72 65 71 75 69 72 65 64 2e 20 49 66 20 74  s required. If t
28290 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
282a0 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f  en into.** one o
282b0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20  f the journals, 
282c0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
282d0 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20  g bit is set in 
282e0 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49  the .** Pager.pI
282f0 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20  nJournal bitvec 
28300 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76  and the PagerSav
28310 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
28320 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f  int bitvecs.** o
28330 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65 70  f any open savep
28340 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70 72  oints as appropr
28350 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iate..*/.static 
28360 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 28  int pager_write(
28370 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76  PgHdr *pPg){.  v
28380 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67  oid *pData = pPg
28390 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61 67 65 72  ->pData;.  Pager
283a0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
283b0 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
283c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
283d0 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72   /* Check for er
283e0 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rors.  */.  if( 
283f0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
28400 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70  ){ .    return p
28410 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
28420 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
28430 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
28440 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28450 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  PERM;.  }..  ass
28460 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65  ert( !pPager->se
28470 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48  tMaster );..  CH
28480 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a  ECK_PAGE(pPg);..
28490 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
284a0 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66  ge as dirty.  If
284b0 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c   the page has al
284c0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
284d0 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a  en.  ** to the j
284e0 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63  ournal then we c
284f0 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20  an return right 
28500 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  away..  */.  sql
28510 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
28520 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20  rty(pPg);.  if( 
28530 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
28540 67 29 20 26 26 20 21 73 75 62 6a 52 65 71 75 69  g) && !subjRequi
28550 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a  resPage(pPg) ){.
28560 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f      pPager->dbMo
28570 64 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d 65  dified = 1;.  }e
28580 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  lse{..    /* If 
28590 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c  we get this far,
285a0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
285b0 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
285c0 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74   be.    ** writt
285d0 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  en to the transa
285e0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72  ction journal or
285f0 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20   the ckeckpoint 
28600 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f  journal.    ** o
28610 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20  r both..    **. 
28620 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63     ** First chec
28630 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 74 68  k to see that th
28640 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
28650 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64  urnal exists and
28660 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20 69  .    ** create i
28670 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  t if it does not
28680 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
28690 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
286a0 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
286b0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
286c0 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70  ite3PagerBegin(p
286d0 50 61 67 65 72 2c 20 30 2c 20 70 50 61 67 65 72  Pager, 0, pPager
286e0 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 3b  ->subjInMemory);
286f0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
28700 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28710 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
28720 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
28730 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
28740 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
28750 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
28760 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50  ager->jfd) && pP
28770 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
28780 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70 50  .          && pP
28790 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
287a0 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
287b0 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20  MODE_OFF ){.    
287c0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
287d0 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
287e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
287f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
28800 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
28810 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69    pPager->dbModi
28820 66 69 65 64 20 3d 20 31 3b 0a 20 20 0a 20 20 20  fied = 1;.  .   
28830 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
28840 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20  ion journal now 
28850 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61  exists and we ha
28860 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ve a RESERVED or
28870 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55   an.    ** EXCLU
28880 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
28890 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
288a0 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  ile.  Write the 
288b0 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a  current page to.
288c0 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73      ** the trans
288d0 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69  action journal i
288e0 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72  f it is not ther
288f0 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  e already..    *
28900 2f 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 49  /.    if( !pageI
28910 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26  nJournal(pPg) &&
28920 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
28930 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66  jfd) ){.      if
28940 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61  ( pPg->pgno<=pPa
28950 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
28960 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 63  ){.        u32 c
28970 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63 68  ksum;.        ch
28980 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20  ar *pData2;..   
28990 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c       /* We shoul
289a0 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f  d never write to
289b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
289c0 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a  e the page that.
289d0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
289e0 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ins the database
289f0 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c   locks.  The fol
28a00 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65  lowing assert ve
28a10 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 2a  rifies.        *
28a20 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  * that we do not
28a30 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  . */.        ass
28a40 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d  ert( pPg->pgno!=
28a50 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
28a60 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20  ager) );.       
28a70 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
28a80 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
28a90 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 7, return SQLI
28aa0 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32  TE_NOMEM, pData2
28ab0 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d  );.        cksum
28ac0 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70   = pager_cksum(p
28ad0 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74  Pager, (u8*)pDat
28ae0 61 32 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  a2);.        rc 
28af0 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
28b00 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
28b10 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
28b20 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
28b30 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
28b40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
28b50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
28b60 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
28b70 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
28b80 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  r->pageSize,.   
28b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ba0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
28bb0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 20  r->journalOff + 
28bc0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  4);.          pP
28bd0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
28be0 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
28bf0 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20 20  Size+4;.        
28c00 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
28c10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28c20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72           rc = wr
28c30 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
28c40 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
28c50 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d  ournalOff, cksum
28c60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
28c70 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
28c80 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a  += 4;.        }.
28c90 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
28ca0 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c  ("JOUT %p %d %ll
28cb0 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
28cc0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20   pPg->pgno, .   
28cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
28ce0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
28cf0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
28d00 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41  ze));.        PA
28d10 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
28d20 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
28d30 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41  unt);.        PA
28d40 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e  GERTRACE(("JOURN
28d50 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  AL %d page %d ne
28d60 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25  edSync=%d hash(%
28d70 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
28d80 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
28d90 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
28da0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
28db0 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ((pPg->flags&PGH
28dc0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
28dd0 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  0), pager_pageha
28de0 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20 20  sh(pPg)));..    
28df0 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61      /* Even if a
28e00 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c  n IO or diskfull
28e10 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
28e20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  while journallin
28e30 67 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  g the.        **
28e40 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c 6f   page in the blo
28e50 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74 68  ck above, set th
28e60 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61 67  e need-sync flag
28e70 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 20   for the page.. 
28e80 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77         ** Otherw
28e90 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72  ise, when the tr
28ea0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
28eb0 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f  led back, the lo
28ec0 67 69 63 20 69 6e 0a 20 20 20 20 20 20 20 20 2a  gic in.        *
28ed0 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  * playback_one_p
28ee0 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b  age() will think
28ef0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
28f00 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f  eeds to be resto
28f10 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  red.        ** i
28f20 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
28f30 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49  ile. And if an I
28f40 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
28f50 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20  hile doing so,. 
28f60 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63         ** then c
28f70 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f  orruption may fo
28f80 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f  llow..        */
28f90 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50  .        if( !pP
28fa0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
28fb0 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66            pPg->f
28fc0 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45  lags |= PGHDR_NE
28fd0 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20  ED_SYNC;.       
28fe0 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
28ff0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
29000 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   }..        /* A
29010 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
29020 72 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20  rred writing to 
29030 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
29040 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 2a  . The .        *
29050 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  * transaction wi
29060 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ll be rolled bac
29070 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72 20 61  k by the layer a
29080 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bove..        */
29090 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
290a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
290b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
290c0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  c;.        }..  
290d0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
290e0 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ec++;.        as
290f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
29100 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
29110 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
29120 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
29130 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
29140 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
29150 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
29160 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
29170 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
29180 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
29190 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
291a0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
291b0 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70  rc |= addToSavep
291c0 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
291d0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  er, pPg->pgno);.
291e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
291f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29200 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
29210 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
29220 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
29230 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
29240 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
29250 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67         if( !pPag
29260 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
29270 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  ed && !pPager->n
29280 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  oSync ){.       
29290 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
292a0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
292b0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
292c0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
292d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
292e0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
292f0 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20  "APPEND %d page 
29300 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e  %d needSync=%d\n
29310 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
29320 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
29330 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20  r), pPg->pgno,. 
29340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
29350 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
29360 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29  _NEED_SYNC)?1:0)
29370 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
29380 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
29390 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
293a0 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64  rnal is open and
293b0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
293c0 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74   in it,.    ** t
293d0 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75  hen write the cu
293e0 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68  rrent page to th
293f0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
29400 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a  nal.  Note that.
29410 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65      ** the state
29420 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ment journal for
29430 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d  mat differs from
29440 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f   the standard jo
29450 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20  urnal format.   
29460 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f   ** in that it o
29470 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75  mits the checksu
29480 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65  ms and the heade
29490 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
294a0 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  ( subjRequiresPa
294b0 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 20  ge(pPg) ){.     
294c0 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c   rc = subjournal
294d0 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d  Page(pPg);.    }
294e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74  .  }..  /* Updat
294f0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
29500 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a  ize and return..
29510 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
29520 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
29530 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20  GER_SHARED );.  
29540 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
29550 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a  ze<pPg->pgno ){.
29560 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
29570 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  ze = pPg->pgno;.
29580 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
29590 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
295a0 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
295b0 69 74 65 61 62 6c 65 2e 20 54 68 69 73 20 72 6f  iteable. This ro
295c0 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61  utine must be ca
295d0 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20  lled before .** 
295e0 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20 74  making changes t
295f0 6f 20 61 20 70 61 67 65 2e 20 54 68 65 20 63 61  o a page. The ca
29600 6c 6c 65 72 20 6d 75 73 74 20 63 68 65 63 6b 20  ller must check 
29610 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
29620 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66 75 6e   .** of this fun
29630 63 74 69 6f 6e 20 61 6e 64 20 62 65 20 63 61 72  ction and be car
29640 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61 6e  eful not to chan
29650 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61  ge any page data
29660 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69 73   unless .** this
29670 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
29680 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
29690 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
296a0 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75   between this fu
296b0 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72  nction and pager
296c0 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74  _write() is that
296d0 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
296e0 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74  n also deals wit
296f0 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61  h the special ca
29700 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f  se where 2 or mo
29710 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20  re pages.** fit 
29720 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b  on a single disk
29730 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73   sector. In this
29740 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73   case all co-res
29750 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d  ident pages.** m
29760 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72  ust have been wr
29770 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
29780 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
29790 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
297a0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
297b0 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  curs, SQLITE_NOM
297c0 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f  EM or an IO erro
297d0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
297e0 65 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70 72  ed.** as appropr
297f0 69 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  iate. Otherwise,
29800 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
29810 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  nt sqlite3PagerW
29820 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62  rite(DbPage *pDb
29830 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Page){.  int rc 
29840 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
29850 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62  PgHdr *pPg = pDb
29860 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70  Page;.  Pager *p
29870 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
29880 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67  ger;.  Pgno nPag
29890 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50  ePerSector = (pP
298a0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
298b0 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
298c0 65 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67 65  e);..  if( nPage
298d0 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20  PerSector>1 ){. 
298e0 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75     Pgno nPageCou
298f0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nt;          /* 
29900 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
29910 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
29920 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67  e file */.    Pg
29930 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20  no pg1;         
29940 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
29950 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63   page of the sec
29960 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74  tor pPg is locat
29970 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e  ed on. */.    in
29980 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  t nPage;        
29990 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
299a0 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74  r of pages start
299b0 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f  ing at pg1 to jo
299c0 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74  urnal */.    int
299d0 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
299e0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
299f0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  ounter */.    in
29a00 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20  t needSync = 0; 
29a10 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
29a20 69 66 20 61 6e 79 20 70 61 67 65 20 68 61 73 20  if any page has 
29a30 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
29a40 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74  */..    /* Set t
29a50 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61  he doNotSync fla
29a60 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20  g to 1. This is 
29a70 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f  because we canno
29a80 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e 61  t allow a journa
29a90 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20  l.    ** header 
29aa0 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62 65  to be written be
29ab0 74 77 65 65 6e 20 74 68 65 20 70 61 67 65 73 20  tween the pages 
29ac0 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68 69  journaled by thi
29ad0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  s function..    
29ae0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  */.    assert( !
29af0 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73  MEMDB );.    ass
29b00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
29b10 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  otSync==0 );.   
29b20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
29b30 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 1;..    /* 
29b40 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d  This trick assum
29b50 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68 65  es that both the
29b60 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
29b70 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20  ector-size are. 
29b80 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72     ** an integer
29b90 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20   power of 2. It 
29ba0 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70 67  sets variable pg
29bb0 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66  1 to the identif
29bc0 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ier.    ** of th
29bd0 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
29be0 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
29bf0 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20  s located on..  
29c00 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28    */.    pg1 = (
29c10 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20  (pPg->pgno-1) & 
29c20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  ~(nPagePerSector
29c30 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 73  -1)) + 1;..    s
29c40 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
29c50 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 28 69 6e  ount(pPager, (in
29c60 74 20 2a 29 26 6e 50 61 67 65 43 6f 75 6e 74 29  t *)&nPageCount)
29c70 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
29c80 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29  gno>nPageCount )
29c90 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
29ca0 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31  (pPg->pgno - pg1
29cb0 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  )+1;.    }else i
29cc0 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72  f( (pg1+nPagePer
29cd0 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43  Sector-1)>nPageC
29ce0 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50  ount ){.      nP
29cf0 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74  age = nPageCount
29d00 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73  +1-pg1;.    }els
29d10 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  e{.      nPage =
29d20 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b   nPagePerSector;
29d30 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
29d40 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20  t(nPage>0);.    
29d50 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d  assert(pg1<=pPg-
29d60 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65  >pgno);.    asse
29d70 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70  rt((pg1+nPage)>p
29d80 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20  Pg->pgno);..    
29d90 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61  for(ii=0; ii<nPa
29da0 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ge && rc==SQLITE
29db0 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  _OK; ii++){.    
29dc0 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b    Pgno pg = pg1+
29dd0 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20  ii;.      PgHdr 
29de0 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66  *pPage;.      if
29df0 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20  ( pg==pPg->pgno 
29e00 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76 65  || !sqlite3Bitve
29e10 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
29e20 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b  nJournal, pg) ){
29e30 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21  .        if( pg!
29e40 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
29e50 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
29e60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
29e70 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
29e80 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20   pg, &pPage);.  
29e90 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
29ea0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29eb0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
29ec0 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29  ger_write(pPage)
29ed0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
29ee0 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50  ( pPage->flags&P
29ef0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29  GHDR_NEED_SYNC )
29f00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
29f10 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
29f20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
29f30 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  rt(pPager->needS
29f40 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ync);.          
29f50 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
29f60 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
29f70 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
29f80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
29f90 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
29fa0 28 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c  (pPage = pager_l
29fb0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
29fc0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
29fd0 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67   if( pPage->flag
29fe0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
29ff0 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  C ){.          n
2a000 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
2a010 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
2a020 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
2a030 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  (pPage);.      }
2a040 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
2a050 66 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  f the PGHDR_NEED
2a060 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20 73 65  _SYNC flag is se
2a070 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65  t for any of the
2a080 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20 20   nPage pages .  
2a090 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
2a0a0 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65   pg1, then it ne
2a0b0 65 64 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f  eds to be set fo
2a0c0 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42  r all of them. B
2a0d0 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72  ecause.    ** wr
2a0e0 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20  iting to any of 
2a0f0 74 68 65 73 65 20 6e 50 61 67 65 20 70 61 67 65  these nPage page
2a100 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65  s may damage the
2a110 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20   others, the.   
2a120 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
2a130 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79   must contain sy
2a140 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66  nc()ed copies of
2a150 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20   all of them.   
2a160 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f   ** before any o
2a170 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72  f them can be wr
2a180 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65  itten out to the
2a190 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2a1a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
2a1b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2a1c0 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
2a1d0 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
2a1e0 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79   && pPager->noSy
2a1f0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66  nc==0 );.      f
2a200 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
2a210 65 20 26 26 20 6e 65 65 64 53 79 6e 63 3b 20 69  e && needSync; i
2a220 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 50 67  i++){.        Pg
2a230 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70 61 67  Hdr *pPage = pag
2a240 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
2a250 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20 20 20  , pg1+ii);.     
2a260 20 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a     if( pPage ){.
2a270 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d            pPage-
2a280 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
2a290 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20  NEED_SYNC;.     
2a2a0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
2a2b0 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
2a2c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2a2d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50  .      assert(pP
2a2e0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b  ager->needSync);
2a2f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
2a300 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
2a310 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20  tSync==1 );.    
2a320 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
2a330 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
2a340 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
2a350 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
2a360 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2a370 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2a380 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65  TRUE if the page
2a390 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72   given in the ar
2a3a0 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69  gument was previ
2a3b0 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20  ously passed.** 
2a3c0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
2a3d0 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65  rite().  In othe
2a3e0 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  r words, return 
2a3f0 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b  TRUE if it is ok
2a400 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68  .** to change th
2a410 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
2a420 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65   page..*/.#ifnde
2a430 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  f NDEBUG.int sql
2a440 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2a450 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67  able(DbPage *pPg
2a460 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  ){.  return pPg-
2a470 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
2a480 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TY;.}.#endif../*
2a490 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
2a4a0 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
2a4b0 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
2a4c0 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
2a4d0 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20  ary to.** write 
2a4e0 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
2a4f0 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61 63 6b  on page pPg back
2a500 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76   to the disk, ev
2a510 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61  en though.** tha
2a520 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20  t page might be 
2a530 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
2a540 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20    This happens, 
2a550 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
2a560 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 68 61  n.** the page ha
2a570 73 20 62 65 65 6e 20 61 64 64 65 64 20 61 73 20  s been added as 
2a580 61 20 6c 65 61 66 20 6f 66 20 74 68 65 20 66 72  a leaf of the fr
2a590 65 65 6c 69 73 74 20 61 6e 64 20 73 6f 20 69 74  eelist and so it
2a5a0 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f 20  s.** content no 
2a5b0 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72 73 2e 0a  longer matters..
2a5c0 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79  **.** The overly
2a5d0 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79  ing software lay
2a5e0 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
2a5f0 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f  utine when all o
2a600 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e  f the data.** on
2a610 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
2a620 69 73 20 75 6e 75 73 65 64 2e 20 54 68 65 20 70  is unused. The p
2a630 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70  ager marks the p
2a640 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a  age as clean so.
2a650 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  ** that it does 
2a660 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20  not get written 
2a670 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54  to disk..**.** T
2a680 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74  ests show that t
2a690 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
2a6a0 20 63 61 6e 20 71 75 61 64 72 75 70 6c 65 20 74   can quadruple t
2a6b0 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67  he speed of larg
2a6c0 65 20 0a 2a 2a 20 44 45 4c 45 54 45 20 6f 70 65  e .** DELETE ope
2a6d0 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64  rations..*/.void
2a6e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
2a6f0 74 57 72 69 74 65 28 50 67 48 64 72 20 2a 70 50  tWrite(PgHdr *pP
2a700 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
2a710 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
2a720 72 3b 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66  r;.  if( (pPg->f
2a730 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
2a740 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 53 61  ) && pPager->nSa
2a750 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20 20  vepoint==0 ){.  
2a760 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 44    PAGERTRACE(("D
2a770 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20 25  ONT_WRITE page %
2a780 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d  d of %d\n", pPg-
2a790 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
2a7a0 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 49 4f  Pager)));.    IO
2a7b0 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70  TRACE(("CLEAN %p
2a7c0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
2a7d0 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20  pPg->pgno)).    
2a7e0 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
2a7f0 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 3b 0a  HDR_DONT_WRITE;.
2a800 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
2a810 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50  ECK_PAGES.    pP
2a820 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
2a830 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
2a840 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a  );.#endif.  }.}.
2a850 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2a860 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
2a870 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76   increment the v
2a880 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61  alue of the data
2a890 62 61 73 65 20 66 69 6c 65 20 0a 2a 2a 20 63 68  base file .** ch
2a8a0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 20 73 74  ange-counter, st
2a8b0 6f 72 65 64 20 61 73 20 61 20 34 2d 62 79 74 65  ored as a 4-byte
2a8c0 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
2a8d0 67 65 72 20 73 74 61 72 74 69 6e 67 20 61 74 20  ger starting at 
2a8e0 0a 2a 2a 20 62 79 74 65 20 6f 66 66 73 65 74 20  .** byte offset 
2a8f0 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  24 of the pager 
2a900 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  file..**.** If t
2a910 68 65 20 69 73 44 69 72 65 63 74 20 66 6c 61 67  he isDirect flag
2a920 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   is zero, then t
2a930 68 69 73 20 69 73 20 64 6f 6e 65 20 62 79 20 63  his is done by c
2a940 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74  alling .** sqlit
2a950 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f  e3PagerWrite() o
2a960 6e 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 6d  n page 1, then m
2a970 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e  odifying the con
2a980 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20  tents of the.** 
2a990 70 61 67 65 20 64 61 74 61 2e 20 49 6e 20 74 68  page data. In th
2a9a0 69 73 20 63 61 73 65 20 74 68 65 20 66 69 6c 65  is case the file
2a9b0 20 77 69 6c 6c 20 62 65 20 75 70 64 61 74 65 64   will be updated
2a9c0 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   when the curren
2a9d0 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
2a9e0 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a   is committed..*
2a9f0 2a 0a 2a 2a 20 54 68 65 20 69 73 44 69 72 65 63  *.** The isDirec
2aa00 74 20 66 6c 61 67 20 6d 61 79 20 6f 6e 6c 79 20  t flag may only 
2aa10 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  be non-zero if t
2aa20 68 65 20 6c 69 62 72 61 72 79 20 77 61 73 20 63  he library was c
2aa30 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77 69 74 68 20  ompiled.** with 
2aa40 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  the SQLITE_ENABL
2aa50 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20 6d  E_ATOMIC_WRITE m
2aa60 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 49 6e  acro defined. In
2aa70 20 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69   this case,.** i
2aa80 66 20 69 73 44 69 72 65 63 74 20 69 73 20 6e 6f  f isDirect is no
2aa90 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
2aaa0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2aab0 73 20 75 70 64 61 74 65 64 20 64 69 72 65 63 74  s updated direct
2aac0 6c 79 0a 2a 2a 20 62 79 20 77 72 69 74 69 6e 67  ly.** by writing
2aad0 20 61 6e 20 75 70 64 61 74 65 64 20 76 65 72 73   an updated vers
2aae0 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 75 73  ion of page 1 us
2aaf0 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 74 68  ing a call to th
2ab00 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 57  e .** sqlite3OsW
2ab10 72 69 74 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e  rite() function.
2ab20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2ab30 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
2ab40 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70  counter(Pager *p
2ab50 50 61 67 65 72 2c 20 69 6e 74 20 69 73 44 69 72  Pager, int isDir
2ab60 65 63 74 4d 6f 64 65 29 7b 0a 20 20 69 6e 74 20  ectMode){.  int 
2ab70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2ab80 0a 20 20 2f 2a 20 44 65 63 6c 61 72 65 20 61 6e  .  /* Declare an
2ab90 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 6e  d initialize con
2aba0 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 27 69  stant integer 'i
2abb0 73 44 69 72 65 63 74 27 2e 20 49 66 20 74 68 65  sDirect'. If the
2abc0 0a 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69  .  ** atomic-wri
2abd0 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
2abe0 69 73 20 65 6e 61 62 6c 65 64 20 69 6e 20 74 68  is enabled in th
2abf0 69 73 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 69  is build, then i
2ac00 73 44 69 72 65 63 74 0a 20 20 2a 2a 20 69 73 20  sDirect.  ** is 
2ac10 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74  initialized to t
2ac20 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
2ac30 61 73 20 74 68 65 20 69 73 44 69 72 65 63 74 4d  as the isDirectM
2ac40 6f 64 65 20 70 61 72 61 6d 65 74 65 72 0a 20 20  ode parameter.  
2ac50 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ** to this funct
2ac60 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ion. Otherwise, 
2ac70 69 74 20 69 73 20 61 6c 77 61 79 73 20 73 65 74  it is always set
2ac80 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20   to zero..  **. 
2ac90 20 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73 20   ** The idea is 
2aca0 74 68 61 74 20 69 66 20 74 68 65 20 61 74 6f 6d  that if the atom
2acb0 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
2acc0 61 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 2a  ation is not.  *
2acd0 2a 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d  * enabled at com
2ace0 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 20 63  pile time, the c
2acf0 6f 6d 70 69 6c 65 72 20 63 61 6e 20 6f 6d 69 74  ompiler can omit
2ad00 20 74 68 65 20 74 65 73 74 73 20 6f 66 0a 20 20   the tests of.  
2ad10 2a 2a 20 27 69 73 44 69 72 65 63 74 27 20 62 65  ** 'isDirect' be
2ad20 6c 6f 77 2c 20 61 73 20 77 65 6c 6c 20 61 73 20  low, as well as 
2ad30 74 68 65 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73  the block enclos
2ad40 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22  ed in the.  ** "
2ad50 69 66 28 20 69 73 44 69 72 65 63 74 20 29 22 20  if( isDirect )" 
2ad60 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  condition..  */.
2ad70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45  #ifndef SQLITE_E
2ad80 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
2ad90 54 45 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  TE.  const int i
2ada0 73 44 69 72 65 63 74 20 3d 20 30 3b 0a 20 20 61  sDirect = 0;.  a
2adb0 73 73 65 72 74 28 20 69 73 44 69 72 65 63 74 4d  ssert( isDirectM
2adc0 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53  ode==0 );.  UNUS
2add0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44  ED_PARAMETER(isD
2ade0 69 72 65 63 74 4d 6f 64 65 29 3b 0a 23 65 6c 73  irectMode);.#els
2adf0 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73  e.  const int is
2ae00 44 69 72 65 63 74 20 3d 20 69 73 44 69 72 65 63  Direct = isDirec
2ae10 74 4d 6f 64 65 3b 0a 23 65 6e 64 69 66 0a 0a 20  tMode;.#endif.. 
2ae20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2ae30 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
2ae40 53 45 52 56 45 44 20 29 3b 0a 20 20 69 66 28 20  SERVED );.  if( 
2ae50 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43  !pPager->changeC
2ae60 6f 75 6e 74 44 6f 6e 65 20 26 26 20 70 50 61 67  ountDone && pPag
2ae70 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a  er->dbSize>0 ){.
2ae80 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64      PgHdr *pPgHd
2ae90 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
2aea0 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 74    /* Reference t
2aeb0 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 20 20  o page 1 */.    
2aec0 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  u32 change_count
2aed0 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er;           /*
2aee0 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f   Initial value o
2aef0 66 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  f change-counter
2af00 20 66 69 65 6c 64 20 2a 2f 0a 0a 20 20 20 20 61   field */..    a
2af10 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
2af20 74 65 6d 70 46 69 6c 65 20 26 26 20 69 73 4f 70  tempFile && isOp
2af30 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
2af40 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70  ;..    /* Open p
2af50 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c  age 1 of the fil
2af60 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a  e for writing. *
2af70 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2af80 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
2af90 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a  r, 1, &pPgHdr);.
2afa0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 48      assert( pPgH
2afb0 64 72 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  dr==0 || rc==SQL
2afc0 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f  ITE_OK );..    /
2afd0 2a 20 49 66 20 70 61 67 65 20 6f 6e 65 20 77 61  * If page one wa
2afe0 73 20 66 65 74 63 68 65 64 20 73 75 63 63 65 73  s fetched succes
2aff0 73 66 75 6c 6c 79 2c 20 61 6e 64 20 74 68 69 73  sfully, and this
2b000 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74   function is not
2b010 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e  .    ** operatin
2b020 67 20 69 6e 20 64 69 72 65 63 74 2d 6d 6f 64 65  g in direct-mode
2b030 2c 20 6d 61 6b 65 20 70 61 67 65 20 31 20 77 72  , make page 1 wr
2b040 69 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  itable..    */. 
2b050 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2b060 45 5f 4f 4b 20 26 26 20 21 69 73 44 69 72 65 63  E_OK && !isDirec
2b070 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
2b080 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2b090 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 7d  e(pPgHdr);.    }
2b0a0 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
2b0b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b0c0 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
2b0d0 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61  e value just rea
2b0e0 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62  d and write it b
2b0f0 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20  ack to byte 24. 
2b100 2a 2f 0a 20 20 20 20 20 20 63 68 61 6e 67 65 5f  */.      change_
2b110 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65  counter = sqlite
2b120 33 47 65 74 34 62 79 74 65 28 28 75 38 2a 29 70  3Get4byte((u8*)p
2b130 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
2b140 73 29 3b 0a 20 20 20 20 20 20 63 68 61 6e 67 65  s);.      change
2b150 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20  _counter++;.    
2b160 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
2b170 61 72 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74  ar*)pPgHdr->pDat
2b180 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f  a)+24, change_co
2b190 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 20 20 2f  unter);..      /
2b1a0 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20  * If running in 
2b1b0 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 77 72 69  direct mode, wri
2b1c0 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
2b1d0 6f 66 20 70 61 67 65 20 31 20 74 6f 20 74 68 65  of page 1 to the
2b1e0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
2b1f0 69 66 28 20 69 73 44 69 72 65 63 74 20 29 7b 0a  if( isDirect ){.
2b200 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f          const vo
2b210 69 64 20 2a 7a 42 75 66 20 3d 20 70 50 67 48 64  id *zBuf = pPgHd
2b220 72 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20  r->pData;.      
2b230 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2b240 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 30 20 29  ->dbFileSize>0 )
2b250 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
2b260 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
2b270 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20  ager->fd, zBuf, 
2b280 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
2b290 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 0);.      }.. 
2b2a0 20 20 20 20 20 2f 2a 20 49 66 20 65 76 65 72 79       /* If every
2b2b0 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 73 65  thing worked, se
2b2c0 74 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e  t the changeCoun
2b2d0 74 44 6f 6e 65 20 66 6c 61 67 2e 20 2a 2f 0a 20  tDone flag. */. 
2b2e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2b2f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b300 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
2b310 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20  CountDone = 1;. 
2b320 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
2b330 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
2b340 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
2b350 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50   */.    sqlite3P
2b360 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72  agerUnref(pPgHdr
2b370 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2b380 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  rc;.}../*.** Syn
2b390 63 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  c the pager file
2b3a0 20 74 6f 20 64 69 73 6b 2e 20 54 68 69 73 20 69   to disk. This i
2b3b0 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e  s a no-op for in
2b3c0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 0a 2a 2a  -memory files.**
2b3d0 20 6f 72 20 70 61 67 65 73 20 77 69 74 68 20 74   or pages with t
2b3e0 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20  he Pager.noSync 
2b3f0 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  flag set..**.** 
2b400 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  If successful, o
2b410 72 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61  r called on a pa
2b420 67 65 72 20 66 6f 72 20 77 68 69 63 68 20 69 74  ger for which it
2b430 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 74 68 69   is a no-op, thi
2b440 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65  s.** function re
2b450 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
2b460 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 49   Otherwise, an I
2b470 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
2b480 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
2b490 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e   sqlite3PagerSyn
2b4a0 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  c(Pager *pPager)
2b4b0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
2b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2b4e0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 66 28  rn code */.  if(
2b4f0 20 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67 65 72   MEMDB || pPager
2b500 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
2b510 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2b520 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
2b530 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
2b540 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
2b550 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
2b560 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2b570 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
2b580 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2b590 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20  e for the pager 
2b5a0 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20  pPager. zMaster 
2b5b0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61  points to the na
2b5c0 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65  me.** of a maste
2b5d0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
2b5e0 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72  hat should be wr
2b5f0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69  itten into the i
2b600 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75  ndividual.** jou
2b610 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74  rnal file. zMast
2b620 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20  er may be NULL, 
2b630 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72  which is interpr
2b640 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65  eted as no maste
2b650 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20  r.** journal (a 
2b660 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
2b670 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
2b680 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2b690 20 65 6e 73 75 72 65 73 20 74 68 61 74 3a 0a 2a   ensures that:.*
2b6a0 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74  *.**   * The dat
2b6b0 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
2b6c0 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 75 70 64  e-counter is upd
2b6d0 61 74 65 64 2c 0a 2a 2a 20 20 20 2a 20 74 68 65  ated,.**   * the
2b6e0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
2b6f0 65 64 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61  ed (unless the a
2b700 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
2b710 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64  mization is used
2b720 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 64 69  ),.**   * all di
2b730 72 74 79 20 70 61 67 65 73 20 61 72 65 20 77 72  rty pages are wr
2b740 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
2b750 61 62 61 73 65 20 66 69 6c 65 2c 20 0a 2a 2a 20  abase file, .** 
2b760 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65    * the database
2b770 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
2b780 65 64 20 28 69 66 20 72 65 71 75 69 72 65 64 29  ed (if required)
2b790 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65  , and.**   * the
2b7a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
2b7b0 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ynced. .**.** Th
2b7c0 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61  e only thing tha
2b7d0 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d  t remains to com
2b7e0 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
2b7f0 69 6f 6e 20 69 73 20 74 6f 20 66 69 6e 61 6c 69  ion is to finali
2b800 7a 65 20 0a 2a 2a 20 28 64 65 6c 65 74 65 2c 20  ze .** (delete, 
2b810 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f  truncate or zero
2b820 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20   the first part 
2b830 6f 66 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  of) the journal 
2b840 66 69 6c 65 20 28 6f 72 20 0a 2a 2a 20 64 65 6c  file (or .** del
2b850 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
2b860 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73  ournal file if s
2b870 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a  pecified)..**.**
2b880 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d   Note that if zM
2b890 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69  aster==NULL, thi
2b8a0 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77  s does not overw
2b8b0 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20  rite a previous 
2b8c0 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20  value.** passed 
2b8d0 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67  to an sqlite3Pag
2b8e0 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
2b8f0 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  () call..**.** I
2b900 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61  f the final para
2b910 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d  meter - noSync -
2b920 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
2b930 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b940 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f   itself.** is no
2b950 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61  t synced. The ca
2b960 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73  ller must call s
2b970 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28  qlite3PagerSync(
2b980 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a  ) directly to.**
2b990 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
2b9a0 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63  se file before c
2b9b0 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61  alling CommitPha
2b9c0 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74  seTwo() to delet
2b9d0 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  e the.** journal
2b9e0 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61   file in this ca
2b9f0 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
2ba00 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
2ba10 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a  seOne(.  Pager *
2ba20 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
2ba30 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
2ba40 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  r object */.  co
2ba50 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
2ba60 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
2ba70 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
2ba80 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
2ba90 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   name */.  int n
2baa0 6f 53 79 6e 63 20 20 20 20 20 20 20 20 20 20 20  oSync           
2bab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2bac0 75 65 20 74 6f 20 6f 6d 69 74 20 74 68 65 20 78  ue to omit the x
2bad0 53 79 6e 63 20 6f 6e 20 74 68 65 20 64 62 20 66  Sync on the db f
2bae0 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ile */.){.  int 
2baf0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2bb00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2bb10 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
2bb20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
2bb30 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Code ){.    retu
2bb40 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
2bb50 64 65 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  de;.  }..  PAGER
2bb60 54 52 41 43 45 28 28 22 44 41 54 41 42 41 53 45  TRACE(("DATABASE
2bb70 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a   SYNC: File=%s z
2bb80 4d 61 73 74 65 72 3d 25 73 20 6e 53 69 7a 65 3d  Master=%s nSize=
2bb90 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50  %d\n", .      pP
2bba0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2bbb0 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
2bbc0 2d 3e 64 62 53 69 7a 65 29 29 3b 0a 0a 20 20 2f  ->dbSize));..  /
2bbd0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
2bbe0 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72  in-memory db, or
2bbf0 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20 62   no pages have b
2bc00 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20  een written to, 
2bc10 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  or this.  ** fun
2bc20 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
2bc30 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69  y been called, i
2bc40 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  t is a no-op..  
2bc50 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 26  */.  if( MEMDB &
2bc60 26 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69  & pPager->dbModi
2bc70 66 69 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  fied ){.    sqli
2bc80 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
2bc90 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
2bca0 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
2bcb0 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
2bcc0 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20 70 50  GER_SYNCED && pP
2bcd0 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
2bce0 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   ){..    /* The 
2bcf0 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
2bd00 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
2bd10 67 65 2d 63 6f 75 6e 74 65 72 2e 20 45 78 61 63  ge-counter. Exac
2bd20 74 6c 79 20 68 6f 77 20 69 74 0a 20 20 20 20 2a  tly how it.    *
2bd30 2a 20 64 6f 65 73 20 74 68 69 73 20 64 65 70 65  * does this depe
2bd40 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  nds on whether o
2bd50 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63  r not the atomic
2bd60 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69 7a 61  -update optimiza
2bd70 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 77 61 73 20  tion.    ** was 
2bd80 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
2bd90 6c 65 20 74 69 6d 65 2c 20 61 6e 64 20 69 66 20  le time, and if 
2bda0 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
2bdb0 20 6d 65 65 74 73 20 74 68 65 20 0a 20 20 20 20   meets the .    
2bdc0 2a 2a 20 72 75 6e 74 69 6d 65 20 63 72 69 74 65  ** runtime crite
2bdd0 72 69 61 20 74 6f 20 75 73 65 20 74 68 65 20 6f  ria to use the o
2bde0 70 65 72 61 74 69 6f 6e 3a 20 0a 20 20 20 20 2a  peration: .    *
2bdf0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68  *.    **    * Th
2be00 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75  e file-system su
2be10 70 70 6f 72 74 73 20 74 68 65 20 61 74 6f 6d 69  pports the atomi
2be20 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74 79  c-write property
2be30 20 66 6f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20   for.    **     
2be40 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20   blocks of size 
2be50 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 20 0a  page-size, and .
2be60 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 69 73      **    * This
2be70 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70   commit is not p
2be80 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66  art of a multi-f
2be90 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ile transaction,
2bea0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2a   and.    **    *
2beb0 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67   Exactly one pag
2bec0 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
2bed0 69 65 64 20 61 6e 64 20 73 74 6f 72 65 20 69 6e  ied and store in
2bee0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2bef0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
2bf00 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
2bf10 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 65 6e 61  tion was not ena
2bf20 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20  bled at compile 
2bf30 74 69 6d 65 2c 20 74 68 65 6e 20 74 68 65 0a 20  time, then the. 
2bf40 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72     ** pager_incr
2bf50 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29  _changecounter()
2bf60 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2bf70 6c 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68  led to update th
2bf80 65 20 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20  e change.    ** 
2bf90 63 6f 75 6e 74 65 72 20 69 6e 20 27 69 6e 64 69  counter in 'indi
2bfa0 72 65 63 74 2d 6d 6f 64 65 27 2e 20 49 66 20 74  rect-mode'. If t
2bfb0 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
2bfc0 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 62  is compiled in b
2bfd0 75 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  ut.    ** is not
2bfe0 20 61 70 70 6c 69 63 61 62 6c 65 20 74 6f 20 74   applicable to t
2bff0 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  his transaction,
2c000 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4a 6f 75   call sqlite3Jou
2c010 72 6e 61 6c 43 72 65 61 74 65 28 29 0a 20 20 20  rnalCreate().   
2c020 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72 65   ** to make sure
2c030 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2c040 65 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 62  e has actually b
2c050 65 65 6e 20 63 72 65 61 74 65 64 2c 20 74 68 65  een created, the
2c060 6e 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 70 61  n call.    ** pa
2c070 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
2c080 6f 75 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61  ounter() to upda
2c090 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  te the change-co
2c0a0 75 6e 74 65 72 20 69 6e 20 69 6e 64 69 72 65 63  unter in indirec
2c0b0 74 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 0a  t.    ** mode. .
2c0c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74      **.    ** Ot
2c0d0 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
2c0e0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
2c0f0 62 6f 74 68 20 65 6e 61 62 6c 65 64 20 61 6e 64  both enabled and
2c100 20 61 70 70 6c 69 63 61 62 6c 65 2c 0a 20 20 20   applicable,.   
2c110 20 2a 2a 20 74 68 65 6e 20 63 61 6c 6c 20 70 61   ** then call pa
2c120 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
2c130 6f 75 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61  ounter() to upda
2c140 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  te the change-co
2c150 75 6e 74 65 72 0a 20 20 20 20 2a 2a 20 69 6e 20  unter.    ** in 
2c160 27 64 69 72 65 63 74 27 20 6d 6f 64 65 2e 20 49  'direct' mode. I
2c170 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
2c180 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
2c190 6c 20 6e 65 76 65 72 20 62 65 0a 20 20 20 20 2a  l never be.    *
2c1a0 2a 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68  * created for th
2c1b0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  is transaction..
2c1c0 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51      */.#ifdef SQ
2c1d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
2c1e0 49 43 5f 57 52 49 54 45 0a 20 20 20 20 50 67 48  IC_WRITE.    PgH
2c1f0 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 61 73 73  dr *pPg;.    ass
2c200 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2c210 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67  er->jfd) || pPag
2c220 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
2c230 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2c240 44 45 5f 4f 46 46 20 29 3b 0a 20 20 20 20 69 66  DE_OFF );.    if
2c250 28 20 21 7a 4d 61 73 74 65 72 20 26 26 20 69 73  ( !zMaster && is
2c260 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2c270 29 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65  ) .     && pPage
2c280 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a  r->journalOff==j
2c290 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50  rnlBufferSize(pP
2c2a0 61 67 65 72 29 20 0a 20 20 20 20 20 26 26 20 70  ager) .     && p
2c2b0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 70  Pager->dbSize>=p
2c2c0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
2c2d0 65 0a 20 20 20 20 20 26 26 20 28 30 3d 3d 28 70  e.     && (0==(p
2c2e0 50 67 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  Pg = sqlite3Pcac
2c2f0 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
2c300 65 72 2d 3e 70 50 43 61 63 68 65 29 29 20 7c 7c  er->pPCache)) ||
2c310 20 30 3d 3d 70 50 67 2d 3e 70 44 69 72 74 79 29   0==pPg->pDirty)
2c320 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
2c330 20 55 70 64 61 74 65 20 74 68 65 20 64 62 20 66   Update the db f
2c340 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  ile change count
2c350 65 72 20 76 69 61 20 74 68 65 20 64 69 72 65 63  er via the direc
2c360 74 2d 77 72 69 74 65 20 6d 65 74 68 6f 64 2e 20  t-write method. 
2c370 54 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 6f  The .      ** fo
2c380 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c  llowing call wil
2c390 6c 20 6d 6f 64 69 66 79 20 74 68 65 20 69 6e 2d  l modify the in-
2c3a0 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
2c3b0 61 74 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  ation of page 1 
2c3c0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 6e 63  .      ** to inc
2c3d0 6c 75 64 65 20 74 68 65 20 75 70 64 61 74 65 64  lude the updated
2c3e0 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
2c3f0 61 6e 64 20 74 68 65 6e 20 77 72 69 74 65 20 70  and then write p
2c400 61 67 65 20 31 20 0a 20 20 20 20 20 20 2a 2a 20  age 1 .      ** 
2c410 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20  directly to the 
2c420 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 42  database file. B
2c430 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 61 74  ecause of the at
2c440 6f 6d 69 63 2d 77 72 69 74 65 20 0a 20 20 20 20  omic-write .    
2c450 20 20 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f 66    ** property of
2c460 20 74 68 65 20 68 6f 73 74 20 66 69 6c 65 2d 73   the host file-s
2c470 79 73 74 65 6d 2c 20 74 68 69 73 20 69 73 20 73  ystem, this is s
2c480 61 66 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  afe..      */.  
2c490 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69      rc = pager_i
2c4a0 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
2c4b0 72 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  r(pPager, 1);.  
2c4c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2c4d0 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  c = sqlite3Journ
2c4e0 61 6c 43 72 65 61 74 65 28 70 50 61 67 65 72 2d  alCreate(pPager-
2c4f0 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28  >jfd);.      if(
2c500 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2c510 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
2c520 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
2c530 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20  counter(pPager, 
2c540 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
2c550 7d 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d  }.#else.    rc =
2c560 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
2c570 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72  gecounter(pPager
2c580 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
2c590 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c5a0 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
2c5b0 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
2c5c0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
2c5d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
2c5e0 20 6d 61 64 65 20 74 68 65 20 64 61 74 61 62 61   made the databa
2c5f0 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e  se smaller, then
2c600 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 2a   all pages.    *
2c610 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72 64 65  * being discarde
2c620 64 20 62 79 20 74 68 65 20 74 72 75 6e 63 61 74  d by the truncat
2c630 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74  ion must be writ
2c640 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
2c650 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20  al.    ** file. 
2c660 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61  This can only ha
2c670 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63  ppen in auto-vac
2c680 75 75 6d 20 6d 6f 64 65 2e 0a 20 20 20 20 2a 2a  uum mode..    **
2c690 0a 20 20 20 20 2a 2a 20 42 65 66 6f 72 65 20 72  .    ** Before r
2c6a0 65 61 64 69 6e 67 20 74 68 65 20 70 61 67 65 73  eading the pages
2c6b0 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
2c6c0 72 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  rs larger than t
2c6d0 68 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  he .    ** curre
2c6e0 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  nt value of Page
2c6f0 72 2e 64 62 53 69 7a 65 2c 20 73 65 74 20 64 62  r.dbSize, set db
2c700 53 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65  Size back to the
2c710 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 74 68   value.    ** th
2c720 61 74 20 69 74 20 74 6f 6f 6b 20 61 74 20 74 68  at it took at th
2c730 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
2c740 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4f 74 68 65  ransaction. Othe
2c750 72 77 69 73 65 2c 20 74 68 65 0a 20 20 20 20 2a  rwise, the.    *
2c760 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
2c770 65 33 50 61 67 65 72 47 65 74 28 29 20 72 65 74  e3PagerGet() ret
2c780 75 72 6e 20 7a 65 72 6f 65 64 20 70 61 67 65 73  urn zeroed pages
2c790 20 69 6e 73 74 65 61 64 20 6f 66 20 0a 20 20 20   instead of .   
2c7a0 20 2a 2a 20 72 65 61 64 69 6e 67 20 64 61 74 61   ** reading data
2c7b0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
2c7c0 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
2c7d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2c7e0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2c7f0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
2c800 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62  bSize<pPager->db
2c810 4f 72 69 67 53 69 7a 65 0a 20 20 20 20 20 26 26  OrigSize.     &&
2c820 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2c830 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
2c840 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
2c850 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69   ){.      Pgno i
2c860 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c880 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
2c890 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
2c8a0 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20 69 53 6b    const Pgno iSk
2c8b0 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47  ip = PAGER_MJ_PG
2c8c0 4e 4f 28 70 50 61 67 65 72 29 3b 20 2f 2a 20 50  NO(pPager); /* P
2c8d0 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 70 61 67 65  ending lock page
2c8e0 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
2c8f0 50 67 6e 6f 20 64 62 53 69 7a 65 20 3d 20 70 50  Pgno dbSize = pP
2c900 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 20 20 20  ager->dbSize;   
2c910 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
2c920 69 6d 61 67 65 20 73 69 7a 65 20 2a 2f 20 0a 20  image size */ . 
2c930 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
2c940 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
2c950 4f 72 69 67 53 69 7a 65 3b 0a 20 20 20 20 20 20  OrigSize;.      
2c960 66 6f 72 28 20 69 3d 64 62 53 69 7a 65 2b 31 3b  for( i=dbSize+1;
2c970 20 69 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72   i<=pPager->dbOr
2c980 69 67 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20  igSize; i++ ){. 
2c990 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69         if( !sqli
2c9a0 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50  te3BitvecTest(pP
2c9b0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
2c9c0 2c 20 69 29 20 26 26 20 69 21 3d 69 53 6b 69 70  , i) && i!=iSkip
2c9d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67   ){.          Pg
2c9e0 48 64 72 20 2a 70 50 61 67 65 3b 20 20 20 20 20  Hdr *pPage;     
2c9f0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
2ca00 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  to journal */.  
2ca10 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2ca20 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
2ca30 67 65 72 2c 20 69 2c 20 26 70 50 61 67 65 29 3b  ger, i, &pPage);
2ca40 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2ca50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
2ca60 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65  oto commit_phase
2ca70 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20  _one_exit;.     
2ca80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2ca90 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2caa0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
2cab0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2cac0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
2cad0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2cae0 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
2caf0 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
2cb00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2cb10 20 20 7d 20 0a 20 20 20 20 20 20 70 50 61 67 65    } .      pPage
2cb20 72 2d 3e 64 62 53 69 7a 65 20 3d 20 64 62 53 69  r->dbSize = dbSi
2cb30 7a 65 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ze;.    }.#endif
2cb40 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  ..    /* Write t
2cb50 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
2cb60 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20  l name into the 
2cb70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
2cb80 20 61 20 6d 61 73 74 65 72 20 0a 20 20 20 20 2a   a master .    *
2cb90 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
2cba0 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ame has already 
2cbb0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
2cbc0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2cbd0 2c 20 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20  , .    ** or if 
2cbe0 7a 4d 61 73 74 65 72 20 69 73 20 4e 55 4c 4c 20  zMaster is NULL 
2cbf0 28 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  (no master journ
2cc00 61 6c 29 2c 20 74 68 65 6e 20 74 68 69 73 20 63  al), then this c
2cc10 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
2cc20 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
2cc30 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
2cc40 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  al(pPager, zMast
2cc50 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
2cc60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2cc70 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
2cc80 6e 65 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a  ne_exit;..    /*
2cc90 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
2cca0 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 61  l file. If the a
2ccb0 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74  tomic-update opt
2ccc0 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 65 69  imization is bei
2ccd0 6e 67 0a 20 20 20 20 2a 2a 20 75 73 65 64 2c 20  ng.    ** used, 
2cce0 74 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 6e  this call will n
2ccf0 6f 74 20 63 72 65 61 74 65 20 74 68 65 20 6a 6f  ot create the jo
2cd00 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 70 65  urnal file or pe
2cd10 72 66 6f 72 6d 20 61 6e 79 0a 20 20 20 20 2a 2a  rform any.    **
2cd20 20 72 65 61 6c 20 49 4f 2e 0a 20 20 20 20 2a 2f   real IO..    */
2cd30 0a 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f  .    rc = syncJo
2cd40 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
2cd50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2cd60 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d  E_OK ) goto comm
2cd70 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69  it_phase_one_exi
2cd80 74 3b 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  t;..    /* Write
2cd90 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
2cda0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2cdb0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 72 63   file. */.    rc
2cdc0 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
2cdd0 61 67 65 6c 69 73 74 28 73 71 6c 69 74 65 33 50  agelist(sqlite3P
2cde0 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
2cdf0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29  Pager->pPCache))
2ce00 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2ce10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ce20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
2ce30 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  ITE_IOERR_BLOCKE
2ce40 44 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  D );.      goto 
2ce50 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
2ce60 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
2ce70 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
2ce80 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70  eanAll(pPager->p
2ce90 50 43 61 63 68 65 29 3b 0a 0a 20 20 20 20 2f 2a  PCache);..    /*
2cea0 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   If the file on 
2ceb0 64 69 73 6b 20 69 73 20 6e 6f 74 20 74 68 65 20  disk is not the 
2cec0 73 61 6d 65 20 73 69 7a 65 20 61 73 20 74 68 65  same size as the
2ced0 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c   database image,
2cee0 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65  .    ** then use
2cef0 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 20   pager_truncate 
2cf00 74 6f 20 67 72 6f 77 20 6f 72 20 73 68 72 69 6e  to grow or shrin
2cf10 6b 20 74 68 65 20 66 69 6c 65 20 68 65 72 65 2e  k the file here.
2cf20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2cf30 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 21 3d  pPager->dbSize!=
2cf40 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
2cf50 7a 65 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  ze ){.      Pgno
2cf60 20 6e 4e 65 77 20 3d 20 70 50 61 67 65 72 2d 3e   nNew = pPager->
2cf70 64 62 53 69 7a 65 20 2d 20 28 70 50 61 67 65 72  dbSize - (pPager
2cf80 2d 3e 64 62 53 69 7a 65 3d 3d 50 41 47 45 52 5f  ->dbSize==PAGER_
2cf90 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29  MJ_PGNO(pPager))
2cfa0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2cfb0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
2cfc0 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
2cfd0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
2cfe0 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
2cff0 65 72 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20  er, nNew);.     
2d000 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2d010 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
2d020 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
2d030 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46  .    }..    /* F
2d040 69 6e 61 6c 6c 79 2c 20 73 79 6e 63 20 74 68 65  inally, sync the
2d050 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2d060 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  */.    if( !pPag
2d070 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 21 6e  er->noSync && !n
2d080 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72  oSync ){.      r
2d090 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
2d0a0 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  c(pPager->fd, pP
2d0b0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
2d0c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54  );.    }.    IOT
2d0d0 52 41 43 45 28 28 22 44 42 53 59 4e 43 20 25 70  RACE(("DBSYNC %p
2d0e0 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20  \n", pPager)).. 
2d0f0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
2d100 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b   = PAGER_SYNCED;
2d110 0a 20 20 7d 0a 0a 63 6f 6d 6d 69 74 5f 70 68 61  .  }..commit_pha
2d120 73 65 5f 6f 6e 65 5f 65 78 69 74 3a 0a 20 20 69  se_one_exit:.  i
2d130 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
2d140 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 7b 0a 20  ERR_BLOCKED ){. 
2d150 20 20 20 2f 2a 20 70 61 67 65 72 5f 69 6e 63 72     /* pager_incr
2d160 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29  _changecounter()
2d170 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f 20   may attempt to 
2d180 6f 62 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73  obtain an exclus
2d190 69 76 65 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20  ive.    ** lock 
2d1a0 74 6f 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63  to spill the cac
2d1b0 68 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4f  he and return IO
2d1c0 45 52 52 5f 42 4c 4f 43 4b 45 44 2e 20 42 75 74  ERR_BLOCKED. But
2d1d0 20 73 69 6e 63 65 20 0a 20 20 20 20 2a 2a 20 74   since .    ** t
2d1e0 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63  here is no chanc
2d1f0 65 20 74 68 65 20 63 61 63 68 65 20 69 73 20 69  e the cache is i
2d200 6e 63 6f 6e 73 69 73 74 65 6e 74 2c 20 69 74 20  nconsistent, it 
2d210 69 73 0a 20 20 20 20 2a 2a 20 62 65 74 74 65 72  is.    ** better
2d220 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54   to return SQLIT
2d230 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2a 2f 0a  E_BUSY..    **/.
2d240 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2d250 42 55 53 59 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BUSY;.  }.  retu
2d260 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2d270 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
2d280 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ion is called, t
2d290 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2d2a0 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 6c 65   has been comple
2d2b0 74 65 6c 79 0a 2a 2a 20 75 70 64 61 74 65 64 20  tely.** updated 
2d2c0 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20 63  to reflect the c
2d2d0 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74  hanges made by t
2d2e0 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
2d2f0 61 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 73 79  action and.** sy
2d300 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 54 68  nced to disk. Th
2d310 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  e journal file s
2d320 74 69 6c 6c 20 65 78 69 73 74 73 20 69 6e 20 74  till exists in t
2d330 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 0a  he file-system .
2d340 2a 2a 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 69  ** though, and i
2d350 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75  f a failure occu
2d360 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  rs at this point
2d370 20 69 74 20 77 69 6c 6c 20 65 76 65 6e 74 75 61   it will eventua
2d380 6c 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 61  lly.** be used a
2d390 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  s a hot-journal 
2d3a0 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  and the current 
2d3b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
2d3c0 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ed back..**.** T
2d3d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e  his function fin
2d3e0 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e  alizes the journ
2d3f0 61 6c 20 66 69 6c 65 2c 20 65 69 74 68 65 72 20  al file, either 
2d400 62 79 20 64 65 6c 65 74 69 6e 67 2c 20 0a 2a 2a  by deleting, .**
2d410 20 74 72 75 6e 63 61 74 69 6e 67 20 6f 72 20 70   truncating or p
2d420 61 72 74 69 61 6c 6c 79 20 7a 65 72 6f 69 6e 67  artially zeroing
2d430 20 69 74 2c 20 73 6f 20 74 68 61 74 20 69 74 20   it, so that it 
2d440 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 0a  cannot be used .
2d450 2a 2a 20 66 6f 72 20 68 6f 74 2d 6a 6f 75 72 6e  ** for hot-journ
2d460 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 6e 63  al rollback. Onc
2d470 65 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 74  e this is done t
2d480 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
2d490 73 0a 2a 2a 20 69 72 72 65 76 6f 63 61 62 6c 79  s.** irrevocably
2d4a0 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a   committed..**.*
2d4b0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
2d4c0 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f  curs, an IO erro
2d4d0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
2d4e0 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 72  ed and the pager
2d4f0 0a 2a 2a 20 6d 6f 76 65 73 20 69 6e 74 6f 20 74  .** moves into t
2d500 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20  he error state. 
2d510 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
2d520 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2d530 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2d540 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
2d550 54 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65  Two(Pager *pPage
2d560 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
2d570 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2d580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2d590 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
2d5a0 2f 2a 20 44 6f 20 6e 6f 74 20 70 72 6f 63 65 65  /* Do not procee
2d5b0 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  d if the pager i
2d5c0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
2d5d0 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f   error state. */
2d5e0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
2d5f0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65  rrCode ){.    re
2d600 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
2d610 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Code;.  }..  /* 
2d620 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
2d630 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c  ould not be call
2d640 65 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ed if the pager 
2d650 69 73 20 6e 6f 74 20 69 6e 20 61 74 20 6c 65 61  is not in at lea
2d660 73 74 0a 20 20 2a 2a 20 50 41 47 45 52 5f 52 45  st.  ** PAGER_RE
2d670 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 41 6e  SERVED state. An
2d680 64 20 69 6e 64 65 65 64 20 53 51 4c 69 74 65 20  d indeed SQLite 
2d690 6e 65 76 65 72 20 64 6f 65 73 20 74 68 69 73 2e  never does this.
2d6a0 20 42 75 74 20 69 74 20 69 73 0a 20 20 2a 2a 20   But it is.  ** 
2d6b0 6e 69 63 65 20 74 6f 20 68 61 76 65 20 74 68 69  nice to have thi
2d6c0 73 20 64 65 66 65 6e 73 69 76 65 20 62 6c 6f 63  s defensive bloc
2d6d0 6b 20 68 65 72 65 20 61 6e 79 77 61 79 2e 0a 20  k here anyway.. 
2d6e0 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
2d6f0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
2d700 47 45 52 5f 52 45 53 45 52 56 45 44 29 20 29 7b  GER_RESERVED) ){
2d710 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2d720 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
2d730 20 2f 2a 20 41 6e 20 6f 70 74 69 6d 69 7a 61 74   /* An optimizat
2d740 69 6f 6e 2e 20 49 66 20 74 68 65 20 64 61 74 61  ion. If the data
2d750 62 61 73 65 20 77 61 73 20 6e 6f 74 20 61 63 74  base was not act
2d760 75 61 6c 6c 79 20 6d 6f 64 69 66 69 65 64 20 64  ually modified d
2d770 75 72 69 6e 67 0a 20 20 2a 2a 20 74 68 69 73 20  uring.  ** this 
2d780 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
2d790 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
2d7a0 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d  g in exclusive-m
2d7b0 6f 64 65 20 61 6e 64 20 69 73 0a 20 20 2a 2a 20  ode and is.  ** 
2d7c0 75 73 69 6e 67 20 70 65 72 73 69 73 74 65 6e 74  using persistent
2d7d0 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20   journals, then 
2d7e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2d7f0 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20   a no-op..  **. 
2d800 20 2a 2a 20 54 68 65 20 73 74 61 72 74 20 6f 66   ** The start of
2d810 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2d820 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74  e currently cont
2d830 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 6a 6f  ains a single jo
2d840 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64  urnal .  ** head
2d850 65 72 20 77 69 74 68 20 74 68 65 20 6e 52 65 63  er with the nRec
2d860 20 66 69 65 6c 64 20 73 65 74 20 74 6f 20 30 2e   field set to 0.
2d870 20 49 66 20 73 75 63 68 20 61 20 6a 6f 75 72 6e   If such a journ
2d880 61 6c 20 69 73 20 75 73 65 64 20 61 73 0a 20 20  al is used as.  
2d890 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
2d8a0 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72   during hot-jour
2d8b0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 30 20  nal rollback, 0 
2d8c0 63 68 61 6e 67 65 73 20 77 69 6c 6c 20 62 65 20  changes will be 
2d8d0 6d 61 64 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65  made.  ** to the
2d8e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2d8f0 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  So there is no n
2d900 65 65 64 20 74 6f 20 7a 65 72 6f 20 74 68 65 20  eed to zero the 
2d910 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65  journal .  ** he
2d920 61 64 65 72 2e 20 53 69 6e 63 65 20 74 68 65 20  ader. Since the 
2d930 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c  pager is in excl
2d940 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 72  usive mode, ther
2d950 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 2a  e is no need.  *
2d960 2a 20 74 6f 20 64 72 6f 70 20 61 6e 79 20 6c 6f  * to drop any lo
2d970 63 6b 73 20 65 69 74 68 65 72 2e 0a 20 20 2a 2f  cks either..  */
2d980 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
2d990 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26 26 20  bModified==0 && 
2d9a0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
2d9b0 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 70 50 61  eMode .   && pPa
2d9c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2d9d0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
2d9e0 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 29 7b  ODE_PERSIST.  ){
2d9f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2da00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
2da10 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
2da20 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72  pPager) );.    r
2da30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2da40 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41  .  }..  PAGERTRA
2da50 43 45 28 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e  CE(("COMMIT %d\n
2da60 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
2da70 72 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r)));.  assert( 
2da80 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
2da90 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20 4d  AGER_SYNCED || M
2daa0 45 4d 44 42 20 7c 7c 20 21 70 50 61 67 65 72 2d  EMDB || !pPager-
2dab0 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 3b 0a 20  >dbModified );. 
2dac0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
2dad0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
2dae0 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  er, pPager->setM
2daf0 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aster);.  return
2db00 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
2db10 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  ger, rc);.}../*.
2db20 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20  ** Rollback all 
2db30 63 68 61 6e 67 65 73 2e 20 54 68 65 20 64 61 74  changes. The dat
2db40 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b  abase falls back
2db50 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
2db60 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   mode..**.** Thi
2db70 73 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f  s function perfo
2db80 72 6d 73 20 74 77 6f 20 74 61 73 6b 73 3a 0a 2a  rms two tasks:.*
2db90 2a 0a 2a 2a 20 20 20 31 29 20 49 74 20 72 6f 6c  *.**   1) It rol
2dba0 6c 73 20 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  ls back the jour
2dbb0 6e 61 6c 20 66 69 6c 65 2c 20 72 65 73 74 6f 72  nal file, restor
2dbc0 69 6e 67 20 61 6c 6c 20 64 61 74 61 62 61 73 65  ing all database
2dbd0 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 20 20   file and .**   
2dbe0 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63     in-memory cac
2dbf0 68 65 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  he pages to the 
2dc00 73 74 61 74 65 20 74 68 65 79 20 77 65 72 65 20  state they were 
2dc10 69 6e 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  in when the tran
2dc20 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  saction.**      
2dc30 77 61 73 20 6f 70 65 6e 65 64 2c 20 61 6e 64 0a  was opened, and.
2dc40 2a 2a 20 20 20 32 29 20 49 74 20 66 69 6e 61 6c  **   2) It final
2dc50 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  izes the journal
2dc60 20 66 69 6c 65 2c 20 73 6f 20 74 68 61 74 20 69   file, so that i
2dc70 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 66 6f  t is not used fo
2dc80 72 20 68 6f 74 0a 2a 2a 20 20 20 20 20 20 72 6f  r hot.**      ro
2dc90 6c 6c 62 61 63 6b 20 61 74 20 61 6e 79 20 70 6f  llback at any po
2dca0 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
2dcb0 65 2e 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 65 63 74  e..**.** subject
2dcc0 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
2dcd0 67 20 71 75 61 6c 69 66 69 63 61 74 69 6f 6e 73  g qualifications
2dce0 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65  :.**.** * If the
2dcf0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2dd00 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 20 77 68   not yet open wh
2dd10 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
2dd20 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20   is called,.**  
2dd30 20 74 68 65 6e 20 6f 6e 6c 79 20 28 32 29 20 69   then only (2) i
2dd40 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 49 6e 20  s performed. In 
2dd50 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20  this case there 
2dd60 69 73 20 6e 6f 20 6a 6f 75 72 6e 61 6c 20 66 69  is no journal fi
2dd70 6c 65 0a 2a 2a 20 20 20 74 6f 20 72 6f 6c 6c 20  le.**   to roll 
2dd80 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49 66  back..**.** * If
2dd90 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61   in an error sta
2dda0 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  te other than SQ
2ddb0 4c 49 54 45 5f 46 55 4c 4c 2c 20 74 68 65 6e 20  LITE_FULL, then 
2ddc0 74 61 73 6b 20 28 31 29 20 69 73 20 0a 2a 2a 20  task (1) is .** 
2ddd0 20 20 70 65 72 66 6f 72 6d 65 64 2e 20 49 66 20    performed. If 
2dde0 73 75 63 63 65 73 73 66 75 6c 2c 20 74 61 73 6b  successful, task
2ddf0 20 28 32 29 2e 20 52 65 67 61 72 64 6c 65 73 73   (2). Regardless
2de00 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 0a   of the outcome.
2de10 2a 2a 20 20 20 6f 66 20 65 69 74 68 65 72 2c 20  **   of either, 
2de20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
2de30 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
2de40 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
2de50 6c 6c 65 72 0a 2a 2a 20 20 20 28 69 2e 65 2e 20  ller.**   (i.e. 
2de60 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f  either SQLITE_IO
2de70 45 52 52 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f  ERR or SQLITE_CO
2de80 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 2a 20  RRUPT)..**.** * 
2de90 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
2dea0 69 6e 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  in PAGER_RESERVE
2deb0 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74  D state, then at
2dec0 74 65 6d 70 74 20 28 31 29 2e 20 57 68 65 74 68  tempt (1). Wheth
2ded0 65 72 0a 2a 2a 20 20 20 6f 72 20 6e 6f 74 20 28  er.**   or not (
2dee0 31 29 20 69 73 20 73 75 63 63 75 73 73 66 75 6c  1) is succussful
2def0 2c 20 61 6c 73 6f 20 61 74 74 65 6d 70 74 20 28  , also attempt (
2df00 32 29 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  2). If successfu
2df10 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20 53  l, return.**   S
2df20 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77  QLITE_OK. Otherw
2df30 69 73 65 2c 20 65 6e 74 65 72 20 74 68 65 20 65  ise, enter the e
2df40 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20 72  rror state and r
2df50 65 74 75 72 6e 20 74 68 65 20 66 69 72 73 74 20  eturn the first 
2df60 0a 2a 2a 20 20 20 65 72 72 6f 72 20 63 6f 64 65  .**   error code
2df70 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20 0a 2a   encountered. .*
2df80 2a 0a 2a 2a 20 20 20 49 6e 20 74 68 69 73 20 63  *.**   In this c
2df90 61 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ase there is no 
2dfa0 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
2dfb0 64 61 74 61 62 61 73 65 20 77 61 73 20 77 72 69  database was wri
2dfc0 74 74 65 6e 20 74 6f 2e 20 0a 2a 2a 20 20 20 53  tten to. .**   S
2dfd0 6f 20 69 73 20 73 61 66 65 20 74 6f 20 66 69 6e  o is safe to fin
2dfe0 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
2dff0 6c 20 66 69 6c 65 20 65 76 65 6e 20 69 66 20 74  l file even if t
2e000 68 65 20 70 6c 61 79 62 61 63 6b 20 0a 2a 2a 20  he playback .** 
2e010 20 20 28 6f 70 65 72 61 74 69 6f 6e 20 31 29 20    (operation 1) 
2e020 66 61 69 6c 65 64 2e 20 48 6f 77 65 76 65 72 20  failed. However 
2e030 74 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 65  the pager must e
2e040 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73  nter the error s
2e050 74 61 74 65 0a 2a 2a 20 20 20 61 73 20 74 68 65  tate.**   as the
2e060 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2e070 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
2e080 20 61 72 65 20 6e 6f 77 20 73 75 73 70 65 63 74   are now suspect
2e090 2e 0a 2a 2a 0a 2a 2a 20 2a 20 46 69 6e 61 6c 6c  ..**.** * Finall
2e0a0 79 2c 20 69 66 20 69 6e 20 50 41 47 45 52 5f 45  y, if in PAGER_E
2e0b0 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20  XCLUSIVE state, 
2e0c0 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28 31 29  then attempt (1)
2e0d0 2e 20 4f 6e 6c 79 0a 2a 2a 20 20 20 61 74 74 65  . Only.**   atte
2e0e0 6d 70 74 20 28 32 29 20 69 66 20 28 31 29 20 69  mpt (2) if (1) i
2e0f0 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 52 65  s successful. Re
2e100 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
2e110 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a  f successful,.**
2e120 20 20 20 6f 74 68 65 72 77 69 73 65 20 65 6e 74     otherwise ent
2e130 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  er the error sta
2e140 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  te and return th
2e150 65 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  e error code fro
2e160 6d 20 74 68 65 20 0a 2a 2a 20 20 20 66 61 69 6c  m the .**   fail
2e170 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ing operation..*
2e180 2a 0a 2a 2a 20 20 20 49 6e 20 74 68 69 73 20 63  *.**   In this c
2e190 61 73 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ase the database
2e1a0 20 66 69 6c 65 20 6d 61 79 20 68 61 76 65 20 62   file may have b
2e1b0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2e 20  een written to. 
2e1c0 53 6f 20 69 66 20 74 68 65 0a 2a 2a 20 20 20 70  So if the.**   p
2e1d0 6c 61 79 62 61 63 6b 20 6f 70 65 72 61 74 69 6f  layback operatio
2e1e0 6e 20 64 69 64 20 6e 6f 74 20 73 75 63 63 65 65  n did not succee
2e1f0 64 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 20 62  d it would not b
2e200 65 20 73 61 66 65 20 74 6f 20 66 69 6e 61 6c 69  e safe to finali
2e210 7a 65 0a 2a 2a 20 20 20 74 68 65 20 6a 6f 75 72  ze.**   the jour
2e220 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 6e 65 65  nal file. It nee
2e230 64 73 20 74 6f 20 62 65 20 6c 65 66 74 20 69 6e  ds to be left in
2e240 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
2e250 20 73 6f 20 74 68 61 74 0a 2a 2a 20 20 20 73 6f   so that.**   so
2e260 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
2e270 20 63 61 6e 20 75 73 65 20 69 74 20 74 6f 20 72   can use it to r
2e280 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
2e290 61 73 65 20 73 74 61 74 65 20 28 62 79 0a 2a 2a  ase state (by.**
2e2a0 20 20 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72     hot-journal r
2e2b0 6f 6c 6c 62 61 63 6b 29 2e 0a 2a 2f 0a 69 6e 74  ollback)..*/.int
2e2c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
2e2d0 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
2e2e0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
2e2f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2e300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e310 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
2e320 20 50 41 47 45 52 54 52 41 43 45 28 28 22 52 4f   PAGERTRACE(("RO
2e330 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41  LLBACK %d\n", PA
2e340 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
2e350 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
2e360 64 62 4d 6f 64 69 66 69 65 64 20 7c 7c 20 21 69  dbModified || !i
2e370 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2e380 64 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  d) ){.    rc = p
2e390 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
2e3a0 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61  tion(pPager, pPa
2e3b0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b  ger->setMaster);
2e3c0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
2e3d0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
2e3e0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
2e3f0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
2e400 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2e410 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
2e420 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20  LUSIVE ){.      
2e430 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
2e440 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d  Pager, 0);.    }
2e450 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
2e460 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c  ->errCode;.  }el
2e470 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67  se{.    if( pPag
2e480 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
2e490 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
2e4a0 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20     int rc2;.    
2e4b0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
2e4c0 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29  yback(pPager, 0)
2e4d0 3b 0a 20 20 20 20 20 20 72 63 32 20 3d 20 70 61  ;.      rc2 = pa
2e4e0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
2e4f0 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67  ion(pPager, pPag
2e500 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a  er->setMaster);.
2e510 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2e520 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e530 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
2e540 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2e550 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2e560 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
2e570 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 0);.    }..   
2e580 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
2e590 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
2e5a0 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  izeValid = 0;.  
2e5b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61    }..    /* If a
2e5c0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
2e5d0 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b  uring a ROLLBACK
2e5e0 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67  , we can no long
2e5f0 65 72 20 74 72 75 73 74 20 74 68 65 20 70 61 67  er trust the pag
2e600 65 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e  er.    ** cache.
2e610 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 65   So call pager_e
2e620 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77 61  rror() on the wa
2e630 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e  y out to make an
2e640 79 20 65 72 72 6f 72 20 0a 20 20 20 20 2a 2a 20  y error .    ** 
2e650 70 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 20 20  persistent..    
2e660 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
2e670 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
2e680 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rc);.  }.  retur
2e690 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
2e6a0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
2e6b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2e6c0 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f  is opened read-o
2e6d0 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  nly.  Return FAL
2e6e0 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74  SE.** if the dat
2e6f0 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65  abase is (in the
2e700 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a  ory) writable..*
2e710 2f 0a 75 38 20 73 71 6c 69 74 65 33 50 61 67 65  /.u8 sqlite3Page
2e720 72 49 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65  rIsreadonly(Page
2e730 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
2e740 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61  turn pPager->rea
2e750 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  dOnly;.}../*.** 
2e760 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
2e770 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
2e780 74 6f 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f  to the pager..*/
2e790 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2e7a0 72 52 65 66 63 6f 75 6e 74 28 50 61 67 65 72 20  rRefcount(Pager 
2e7b0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
2e7c0 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  rn sqlite3Pcache
2e7d0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
2e7e0 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a  >pPCache);.}../*
2e7f0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
2e800 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
2e810 63 65 73 20 74 6f 20 74 68 65 20 73 70 65 63 69  ces to the speci
2e820 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e  fied page..*/.in
2e830 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  t sqlite3PagerPa
2e840 67 65 52 65 66 63 6f 75 6e 74 28 44 62 50 61 67  geRefcount(DbPag
2e850 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74  e *pPage){.  ret
2e860 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68  urn sqlite3Pcach
2e870 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50  ePageRefcount(pP
2e880 61 67 65 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  age);.}..#ifdef 
2e890 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
2e8a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2e8b0 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
2e8c0 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
2e8d0 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71  only..*/.int *sq
2e8e0 6c 69 74 65 33 50 61 67 65 72 53 74 61 74 73 28  lite3PagerStats(
2e8f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2e900 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31    static int a[1
2e910 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 73 71 6c  1];.  a[0] = sql
2e920 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
2e930 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
2e940 68 65 29 3b 0a 20 20 61 5b 31 5d 20 3d 20 73 71  he);.  a[1] = sq
2e950 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63  lite3PcachePagec
2e960 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
2e970 61 63 68 65 29 3b 0a 20 20 61 5b 32 5d 20 3d 20  ache);.  a[2] = 
2e980 73 71 6c 69 74 65 33 50 63 61 63 68 65 47 65 74  sqlite3PcacheGet
2e990 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72  Cachesize(pPager
2e9a0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b  ->pPCache);.  a[
2e9b0 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  3] = pPager->dbS
2e9c0 69 7a 65 56 61 6c 69 64 20 3f 20 28 69 6e 74 29  izeValid ? (int)
2e9d0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
2e9e0 3a 20 2d 31 3b 0a 20 20 61 5b 34 5d 20 3d 20 70  : -1;.  a[4] = p
2e9f0 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20  Pager->state;.  
2ea00 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65  a[5] = pPager->e
2ea10 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d  rrCode;.  a[6] =
2ea20 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20   pPager->nHit;. 
2ea30 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[7] = pPager->
2ea40 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20  nMiss;.  a[8] = 
2ea50 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62  0;  /* Used to b
2ea60 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20  e pPager->nOvfl 
2ea70 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67  */.  a[9] = pPag
2ea80 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31  er->nRead;.  a[1
2ea90 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72  0] = pPager->nWr
2eaa0 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b  ite;.  return a;
2eab0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
2eac0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
2ead0 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
2eae0 6d 6f 72 79 20 70 61 67 65 72 2e 0a 2a 2f 0a 69  mory pager..*/.i
2eaf0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  nt sqlite3PagerI
2eb00 73 4d 65 6d 64 62 28 50 61 67 65 72 20 2a 70 50  sMemdb(Pager *pP
2eb10 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
2eb20 4d 45 4d 44 42 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  MEMDB;.}../*.** 
2eb30 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65  Check that there
2eb40 20 61 72 65 20 61 74 20 6c 65 61 73 74 20 6e 53   are at least nS
2eb50 61 76 65 70 6f 69 6e 74 20 73 61 76 65 70 6f 69  avepoint savepoi
2eb60 6e 74 73 20 6f 70 65 6e 2e 20 49 66 20 74 68 65  nts open. If the
2eb70 72 65 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e  re are.** curren
2eb80 74 6c 79 20 6c 65 73 73 20 74 68 61 6e 20 6e 53  tly less than nS
2eb90 61 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2c 20  avepoints open, 
2eba0 74 68 65 6e 20 6f 70 65 6e 20 6f 6e 65 20 6f 72  then open one or
2ebb0 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 73   more savepoints
2ebc0 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 75 70 20 74  .** to make up t
2ebd0 68 65 20 64 69 66 66 65 72 65 6e 63 65 2e 20 49  he difference. I
2ebe0 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
2ebf0 73 61 76 65 70 6f 69 6e 74 73 20 69 73 20 61 6c  savepoints is al
2ec00 72 65 61 64 79 0a 2a 2a 20 65 71 75 61 6c 20 74  ready.** equal t
2ec10 6f 20 6e 53 61 76 65 70 6f 69 6e 74 2c 20 74 68  o nSavepoint, th
2ec20 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
2ec30 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
2ec40 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
2ec50 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
2ec60 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
2ec70 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
2ec80 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
2ec90 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 20  s while opening 
2eca0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
2ecb0 66 69 6c 65 2c 20 74 68 65 6e 20 61 6e 20 49 4f  file, then an IO
2ecc0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 0a 2a   error code is.*
2ecd0 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  * returned. Othe
2ece0 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
2ecf0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2ed00 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
2ed10 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
2ed20 2c 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74  , int nSavepoint
2ed30 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2ed40 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2ed50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ed60 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2ed70 0a 20 20 69 6e 74 20 6e 43 75 72 72 65 6e 74 20  .  int nCurrent 
2ed80 3d 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  = pPager->nSavep
2ed90 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  oint;        /* 
2eda0 43 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f  Current number o
2edb0 66 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a  f savepoints */.
2edc0 0a 20 20 69 66 28 20 6e 53 61 76 65 70 6f 69 6e  .  if( nSavepoin
2edd0 74 3e 6e 43 75 72 72 65 6e 74 20 26 26 20 70 50  t>nCurrent && pP
2ede0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
2edf0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 20   ){.    int ii; 
2ee00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
2ee30 61 62 6c 65 20 2a 2f 0a 20 20 20 20 50 61 67 65  able */.    Page
2ee40 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 4e 65 77  rSavepoint *aNew
2ee50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ee60 20 20 20 20 2f 2a 20 4e 65 77 20 50 61 67 65 72      /* New Pager
2ee70 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72 72 61  .aSavepoint arra
2ee80 79 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 69 74  y */..    /* Eit
2ee90 68 65 72 20 74 68 65 72 65 20 69 73 20 6e 6f 20  her there is no 
2eea0 61 63 74 69 76 65 20 6a 6f 75 72 6e 61 6c 20 6f  active journal o
2eeb0 72 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  r the sub-journa
2eec0 6c 20 69 73 20 6f 70 65 6e 20 6f 72 20 0a 20 20  l is open or .  
2eed0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
2eee0 20 69 73 20 61 6c 77 61 79 73 20 73 74 6f 72 65   is always store
2eef0 64 20 69 6e 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  d in memory */. 
2ef00 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2ef10 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30  r->nSavepoint==0
2ef20 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
2ef30 72 2d 3e 73 6a 66 64 29 20 7c 7c 0a 20 20 20 20  r->sjfd) ||.    
2ef40 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2ef50 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
2ef60 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
2ef70 45 4d 4f 52 59 20 29 3b 0a 0a 20 20 20 20 2f 2a  EMORY );..    /*
2ef80 20 47 72 6f 77 20 74 68 65 20 50 61 67 65 72 2e   Grow the Pager.
2ef90 61 53 61 76 65 70 6f 69 6e 74 20 61 72 72 61 79  aSavepoint array
2efa0 20 75 73 69 6e 67 20 72 65 61 6c 6c 6f 63 28 29   using realloc()
2efb0 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
2efc0 4e 4f 4d 45 4d 0a 20 20 20 20 2a 2a 20 69 66 20  NOMEM.    ** if 
2efd0 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  the allocation f
2efe0 61 69 6c 73 2e 20 4f 74 68 65 72 77 69 73 65 2c  ails. Otherwise,
2eff0 20 7a 65 72 6f 20 74 68 65 20 6e 65 77 20 70 6f   zero the new po
2f000 72 74 69 6f 6e 20 69 6e 20 63 61 73 65 20 61 20  rtion in case a 
2f010 0a 20 20 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 66  .    ** malloc f
2f020 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
2f030 69 6c 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 69  ile populating i
2f040 74 20 69 6e 20 74 68 65 20 66 6f 72 28 2e 2e 2e  t in the for(...
2f050 29 20 6c 6f 6f 70 20 62 65 6c 6f 77 2e 0a 20 20  ) loop below..  
2f060 20 20 2a 2f 0a 20 20 20 20 61 4e 65 77 20 3d 20    */.    aNew = 
2f070 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20  (PagerSavepoint 
2f080 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  *)sqlite3Realloc
2f090 28 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  (.        pPager
2f0a0 2d 3e 61 53 61 76 65 70 6f 69 6e 74 2c 20 73 69  ->aSavepoint, si
2f0b0 7a 65 6f 66 28 50 61 67 65 72 53 61 76 65 70 6f  zeof(PagerSavepo
2f0c0 69 6e 74 29 2a 6e 53 61 76 65 70 6f 69 6e 74 0a  int)*nSavepoint.
2f0d0 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21      );.    if( !
2f0e0 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 65  aNew ){.      re
2f0f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2f100 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  M;.    }.    mem
2f110 73 65 74 28 26 61 4e 65 77 5b 6e 43 75 72 72 65  set(&aNew[nCurre
2f120 6e 74 5d 2c 20 30 2c 20 28 6e 53 61 76 65 70 6f  nt], 0, (nSavepo
2f130 69 6e 74 2d 6e 43 75 72 72 65 6e 74 29 20 2a 20  int-nCurrent) * 
2f140 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76 65  sizeof(PagerSave
2f150 70 6f 69 6e 74 29 29 3b 0a 20 20 20 20 70 50 61  point));.    pPa
2f160 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20  ger->aSavepoint 
2f170 3d 20 61 4e 65 77 3b 0a 20 20 20 20 70 50 61 67  = aNew;.    pPag
2f180 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d  er->nSavepoint =
2f190 20 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 0a 20 20   nSavepoint;..  
2f1a0 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
2f1b0 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
2f1c0 20 73 74 72 75 63 74 75 72 65 73 20 6a 75 73 74   structures just
2f1d0 20 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a 20   allocated. */. 
2f1e0 20 20 20 66 6f 72 28 69 69 3d 6e 43 75 72 72 65     for(ii=nCurre
2f1f0 6e 74 3b 20 69 69 3c 6e 53 61 76 65 70 6f 69 6e  nt; ii<nSavepoin
2f200 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  t; ii++){.      
2f210 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2f220 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20  dbSizeValid );. 
2f230 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 6e 4f       aNew[ii].nO
2f240 72 69 67 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  rig = pPager->db
2f250 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Size;.      if( 
2f260 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2f270 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  fd) && pPager->j
2f280 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 29 7b 0a 20  ournalOff>0 ){. 
2f290 20 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e         aNew[ii].
2f2a0 69 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72  iOffset = pPager
2f2b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
2f2c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f2d0 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66     aNew[ii].iOff
2f2e0 73 65 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  set = JOURNAL_HD
2f2f0 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
2f300 20 20 20 20 7d 0a 20 20 20 20 20 20 61 4e 65 77      }.      aNew
2f310 5b 69 69 5d 2e 69 53 75 62 52 65 63 20 3d 20 70  [ii].iSubRec = p
2f320 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 0a  Pager->nSubRec;.
2f330 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 70        aNew[ii].p
2f340 49 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 73 71  InSavepoint = sq
2f350 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
2f360 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e(pPager->dbSize
2f370 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 61 4e  );.      if( !aN
2f380 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f  ew[ii].pInSavepo
2f390 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  int ){.        r
2f3a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2f3b0 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
2f3c0 7d 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74  }..    /* Open t
2f3d0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20  he sub-journal, 
2f3e0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
2f3f0 65 61 64 79 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a  eady opened. */.
2f400 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62      rc = openSub
2f410 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
2f420 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
2f430 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
2f440 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2f450 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  led to rollback 
2f460 6f 72 20 72 65 6c 65 61 73 65 20 28 63 6f 6d 6d  or release (comm
2f470 69 74 29 20 61 20 73 61 76 65 70 6f 69 6e 74 2e  it) a savepoint.
2f480 0a 2a 2a 20 54 68 65 20 73 61 76 65 70 6f 69 6e  .** The savepoin
2f490 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6f 72 20  t to release or 
2f4a0 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 20 6e 6f  rollback need no
2f4b0 74 20 62 65 20 74 68 65 20 6d 6f 73 74 20 72 65  t be the most re
2f4c0 63 65 6e 74 6c 79 20 0a 2a 2a 20 63 72 65 61 74  cently .** creat
2f4d0 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a  ed savepoint..**
2f4e0 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6f 70  .** Parameter op
2f4f0 20 69 73 20 61 6c 77 61 79 73 20 65 69 74 68 65   is always eithe
2f500 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  r SAVEPOINT_ROLL
2f510 42 41 43 4b 20 6f 72 20 53 41 56 45 50 4f 49 4e  BACK or SAVEPOIN
2f520 54 5f 52 45 4c 45 41 53 45 2e 0a 2a 2a 20 49 66  T_RELEASE..** If
2f530 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54   it is SAVEPOINT
2f540 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 72  _RELEASE, then r
2f550 65 6c 65 61 73 65 20 61 6e 64 20 64 65 73 74 72  elease and destr
2f560 6f 79 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  oy the savepoint
2f570 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 69   with.** index i
2f580 53 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 74  Savepoint. If it
2f590 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f   is SAVEPOINT_RO
2f5a0 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 72 6f 6c  LLBACK, then rol
2f5b0 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65  lback all change
2f5c0 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 6f  s.** that have o
2f5d0 63 63 75 72 72 65 64 20 73 69 6e 63 65 20 74 68  ccurred since th
2f5e0 65 20 73 70 65 63 69 66 69 65 64 20 73 61 76 65  e specified save
2f5f0 70 6f 69 6e 74 20 77 61 73 20 63 72 65 61 74 65  point was create
2f600 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 76  d..**.** The sav
2f610 65 70 6f 69 6e 74 20 74 6f 20 72 6f 6c 6c 62 61  epoint to rollba
2f620 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 20 69 73  ck or release is
2f630 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
2f640 61 72 61 6d 65 74 65 72 20 0a 2a 2a 20 69 53 61  arameter .** iSa
2f650 76 65 70 6f 69 6e 74 2e 20 41 20 76 61 6c 75 65  vepoint. A value
2f660 20 6f 66 20 30 20 6d 65 61 6e 73 20 74 6f 20 6f   of 0 means to o
2f670 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 6f 75  perate on the ou
2f680 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e  termost savepoin
2f690 74 0a 2a 2a 20 28 74 68 65 20 66 69 72 73 74 20  t.** (the first 
2f6a0 63 72 65 61 74 65 64 29 2e 20 41 20 76 61 6c 75  created). A valu
2f6b0 65 20 6f 66 20 28 50 61 67 65 72 2e 6e 53 61 76  e of (Pager.nSav
2f6c0 65 70 6f 69 6e 74 2d 31 29 20 6d 65 61 6e 73 20  epoint-1) means 
2f6d0 6f 70 65 72 61 74 65 0a 2a 2a 20 6f 6e 20 74 68  operate.** on th
2f6e0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
2f6f0 63 72 65 61 74 65 64 20 73 61 76 65 70 6f 69 6e  created savepoin
2f700 74 2e 20 49 66 20 69 53 61 76 65 70 6f 69 6e 74  t. If iSavepoint
2f710 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
2f720 0a 2a 2a 20 28 50 61 67 65 72 2e 6e 53 61 76 65  .** (Pager.nSave
2f730 70 6f 69 6e 74 2d 31 29 2c 20 74 68 65 6e 20 74  point-1), then t
2f740 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2f750 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
2f760 66 20 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c  f a negative val
2f770 75 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  ue is passed to 
2f780 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74  this function, t
2f790 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a  hen the current.
2f7a0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
2f7b0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54  s rolled back. T
2f7c0 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74  his is different
2f7d0 20 74 6f 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20   to calling .** 
2f7e0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
2f7f0 62 61 63 6b 28 29 20 62 65 63 61 75 73 65 20 74  back() because t
2f800 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
2f810 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 0a  s not terminate.
2f820 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
2f830 6f 6e 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65  on or unlock the
2f840 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 6a 75   database, it ju
2f850 73 74 20 72 65 73 74 6f 72 65 73 20 74 68 65 20  st restores the 
2f860 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
2f870 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
2f880 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
2f890 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e  te. .**.** In an
2f8a0 79 20 63 61 73 65 2c 20 61 6c 6c 20 73 61 76 65  y case, all save
2f8b0 70 6f 69 6e 74 73 20 77 69 74 68 20 61 6e 20 69  points with an i
2f8c0 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61  ndex greater tha
2f8d0 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a  n iSavepoint .**
2f8e0 20 61 72 65 20 64 65 73 74 72 6f 79 65 64 2e 20   are destroyed. 
2f8f0 49 66 20 74 68 69 73 20 69 73 20 61 20 72 65 6c  If this is a rel
2f900 65 61 73 65 20 6f 70 65 72 61 74 69 6f 6e 20 28  ease operation (
2f910 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
2f920 4c 45 41 53 45 29 2c 0a 2a 2a 20 74 68 65 6e 20  LEASE),.** then 
2f930 73 61 76 65 70 6f 69 6e 74 20 69 53 61 76 65 70  savepoint iSavep
2f940 6f 69 6e 74 20 69 73 20 61 6c 73 6f 20 64 65 73  oint is also des
2f950 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  troyed..**.** Th
2f960 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
2f970 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2f980 4d 45 4d 20 69 66 20 61 20 6d 65 6d 6f 72 79 20  MEM if a memory 
2f990 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
2f9a0 2c 0a 2a 2a 20 6f 72 20 61 6e 20 49 4f 20 65 72  ,.** or an IO er
2f9b0 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 49  ror code if an I
2f9c0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
2f9d0 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63  hile rolling bac
2f9e0 6b 20 61 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  k a .** savepoin
2f9f0 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 73 20  t. If no errors 
2fa00 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b  occur, SQLITE_OK
2fa10 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
2fa20 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67   .int sqlite3Pag
2fa30 65 72 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65  erSavepoint(Page
2fa40 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6f  r *pPager, int o
2fa50 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  p, int iSavepoin
2fa60 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
2fa70 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
2fa80 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49  ert( op==SAVEPOI
2fa90 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70  NT_RELEASE || op
2faa0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
2fab0 42 41 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  BACK );.  assert
2fac0 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20  ( iSavepoint>=0 
2fad0 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  || op==SAVEPOINT
2fae0 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 0a 20 20  _ROLLBACK );..  
2faf0 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 70  if( iSavepoint<p
2fb00 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
2fb10 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b  t ){.    int ii;
2fb20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2fb30 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
2fb40 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77   */.    int nNew
2fb50 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ;          /* Nu
2fb60 6d 62 65 72 20 6f 66 20 72 65 6d 61 69 6e 69 6e  mber of remainin
2fb70 67 20 73 61 76 65 70 6f 69 6e 74 73 20 61 66 74  g savepoints aft
2fb80 65 72 20 74 68 69 73 20 6f 70 2e 20 2a 2f 0a 0a  er this op. */..
2fb90 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
2fba0 74 20 68 6f 77 20 6d 61 6e 79 20 73 61 76 65 70  t how many savep
2fbb0 6f 69 6e 74 73 20 77 69 6c 6c 20 73 74 69 6c 6c  oints will still
2fbc0 20 62 65 20 61 63 74 69 76 65 20 61 66 74 65 72   be active after
2fbd0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6f 70 65   this.    ** ope
2fbe0 72 61 74 69 6f 6e 2e 20 53 74 6f 72 65 20 74 68  ration. Store th
2fbf0 69 73 20 76 61 6c 75 65 20 69 6e 20 6e 4e 65 77  is value in nNew
2fc00 2e 20 54 68 65 6e 20 66 72 65 65 20 72 65 73 6f  . Then free reso
2fc10 75 72 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  urces associated
2fc20 20 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e   .    ** with an
2fc30 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74 68 61  y savepoints tha
2fc40 74 20 61 72 65 20 64 65 73 74 72 6f 79 65 64 20  t are destroyed 
2fc50 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  by this operatio
2fc60 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e  n..    */.    nN
2fc70 65 77 20 3d 20 69 53 61 76 65 70 6f 69 6e 74 20  ew = iSavepoint 
2fc80 2b 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  + (op==SAVEPOINT
2fc90 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20  _ROLLBACK);.    
2fca0 66 6f 72 28 69 69 3d 6e 4e 65 77 3b 20 69 69 3c  for(ii=nNew; ii<
2fcb0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
2fcc0 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  nt; ii++){.     
2fcd0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
2fce0 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53  stroy(pPager->aS
2fcf0 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e  avepoint[ii].pIn
2fd00 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
2fd10 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53  }.    pPager->nS
2fd20 61 76 65 70 6f 69 6e 74 20 3d 20 6e 4e 65 77 3b  avepoint = nNew;
2fd30 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
2fd40 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   is a rollback o
2fd50 70 65 72 61 74 69 6f 6e 2c 20 70 6c 61 79 62 61  peration, playba
2fd60 63 6b 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ck the specified
2fd70 20 73 61 76 65 70 6f 69 6e 74 2e 0a 20 20 20 20   savepoint..    
2fd80 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
2fd90 74 65 6d 70 2d 66 69 6c 65 2c 20 69 74 20 69 73  temp-file, it is
2fda0 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 74   possible that t
2fdb0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2fdc0 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 79  has.    ** not y
2fdd0 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 20  et been opened. 
2fde0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2fdf0 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20  re have been no 
2fe00 63 68 61 6e 67 65 73 20 74 6f 0a 20 20 20 20 2a  changes to.    *
2fe10 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
2fe20 69 6c 65 2c 20 73 6f 20 74 68 65 20 70 6c 61 79  ile, so the play
2fe30 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 63  back operation c
2fe40 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20  an be skipped.. 
2fe50 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 70     */.    if( op
2fe60 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
2fe70 42 41 43 4b 20 26 26 20 69 73 4f 70 65 6e 28 70  BACK && isOpen(p
2fe80 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
2fe90 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
2fea0 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 20  int *pSavepoint 
2feb0 3d 20 28 6e 4e 65 77 3d 3d 30 29 3f 30 3a 26 70  = (nNew==0)?0:&p
2fec0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
2fed0 74 5b 6e 4e 65 77 2d 31 5d 3b 0a 20 20 20 20 20  t[nNew-1];.     
2fee0 20 72 63 20 3d 20 70 61 67 65 72 50 6c 61 79 62   rc = pagerPlayb
2fef0 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 70 50 61  ackSavepoint(pPa
2ff00 67 65 72 2c 20 70 53 61 76 65 70 6f 69 6e 74 29  ger, pSavepoint)
2ff10 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 72  ;.      assert(r
2ff20 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 29 3b  c!=SQLITE_DONE);
2ff30 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
2ff40 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72 65   If this is a re
2ff50 6c 65 61 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lease of the out
2ff60 65 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e 74  ermost savepoint
2ff70 2c 20 74 72 75 6e 63 61 74 65 20 0a 20 20 20 20  , truncate .    
2ff80 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ** the sub-journ
2ff90 61 6c 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  al to zero bytes
2ffa0 20 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a 20 20 20   in size. */.   
2ffb0 20 69 66 28 20 6e 4e 65 77 3d 3d 30 20 26 26 20   if( nNew==0 && 
2ffc0 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
2ffd0 4c 45 41 53 45 20 26 26 20 69 73 4f 70 65 6e 28  LEASE && isOpen(
2ffe0 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b  pPager->sjfd) ){
2fff0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
30000 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
30010 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
30020 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
30030 67 65 72 2d 3e 73 6a 66 64 2c 20 30 29 3b 0a 20  ger->sjfd, 0);. 
30040 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75       pPager->nSu
30050 62 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  bRec = 0;.    }.
30060 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
30070 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
30080 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
30090 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
300a0 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  se file..*/.cons
300b0 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50  t char *sqlite3P
300c0 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50 61 67  agerFilename(Pag
300d0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
300e0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46  eturn pPager->zF
300f0 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
30100 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 46 53  * Return the VFS
30110 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74   structure for t
30120 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e  he pager..*/.con
30130 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  st sqlite3_vfs *
30140 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
30150 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
30160 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
30170 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >pVfs;.}../*.** 
30180 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65 20  Return the file 
30190 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 64  handle for the d
301a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 73 73  atabase file ass
301b0 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
301c0 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73  the pager.  This
301d0 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 4e 55   might return NU
301e0 4c 4c 20 69 66 20 74 68 65 20 66 69 6c 65 20 68  LL if the file h
301f0 61 73 0a 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65  as.** not yet be
30200 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71  en opened..*/.sq
30210 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 71 6c 69  lite3_file *sqli
30220 74 65 33 50 61 67 65 72 46 69 6c 65 28 50 61 67  te3PagerFile(Pag
30230 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
30240 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64  eturn pPager->fd
30250 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
30260 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
30270 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
30280 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  al file..*/.cons
30290 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50  t char *sqlite3P
302a0 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  agerJournalname(
302b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
302c0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
302d0 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a  >zJournal;.}../*
302e0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
302f0 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73  if fsync() calls
30300 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f   are disabled fo
30310 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 52  r this pager.  R
30320 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69  eturn FALSE.** i
30330 66 20 66 73 79 6e 63 28 29 73 20 61 72 65 20 65  f fsync()s are e
30340 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79  xecuted normally
30350 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
30360 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67 65  PagerNosync(Page
30370 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
30380 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53  turn pPager->noS
30390 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  ync;.}..#ifdef S
303a0 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
303b0 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 72 65 74  /*.** Set or ret
303c0 72 69 65 76 65 20 74 68 65 20 63 6f 64 65 63 20  rieve the codec 
303d0 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a  for this pager.*
303e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
303f0 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 6f 64  lite3PagerSetCod
30400 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ec(.  Pager *pPa
30410 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ger,.  void *(*x
30420 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
30430 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20  d*,Pgno,int),.  
30440 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a  void (*xCodecSiz
30450 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74  eChng)(void*,int
30460 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ,int),.  void (*
30470 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64  xCodecFree)(void
30480 2a 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64  *),.  void *pCod
30490 65 63 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ec.){.  if( pPag
304a0 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29  er->xCodecFree )
304b0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46   pPager->xCodecF
304c0 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64  ree(pPager->pCod
304d0 65 63 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78  ec);.  pPager->x
304e0 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a  Codec = xCodec;.
304f0 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
30500 53 69 7a 65 43 68 6e 67 20 3d 20 78 43 6f 64 65  SizeChng = xCode
30510 63 53 69 7a 65 43 68 6e 67 3b 0a 20 20 70 50 61  cSizeChng;.  pPa
30520 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20  ger->xCodecFree 
30530 3d 20 78 43 6f 64 65 63 46 72 65 65 3b 0a 20 20  = xCodecFree;.  
30540 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 20 3d  pPager->pCodec =
30550 20 70 43 6f 64 65 63 3b 0a 20 20 70 61 67 65 72   pCodec;.  pager
30560 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65  ReportSize(pPage
30570 72 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  r);.}.static voi
30580 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47  d *sqlite3PagerG
30590 65 74 43 6f 64 65 63 28 50 61 67 65 72 20 2a 70  etCodec(Pager *p
305a0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
305b0 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 3b   pPager->pCodec;
305c0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
305d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
305e0 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
305f0 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 70 50  Move the page pP
30600 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67  g to location pg
30610 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 0a  no in the file..
30620 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  **.** There must
30630 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65   be no reference
30640 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 72  s to the page pr
30650 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64  eviously located
30660 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68 69   at.** pgno (whi
30670 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67 4f 6c  ch we call pPgOl
30680 64 29 20 74 68 6f 75 67 68 20 74 68 61 74 20 70  d) though that p
30690 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74  age is allowed t
306a0 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68 65  o be.** in cache
306b0 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 70  .  If the page p
306c0 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65  reviously locate
306d0 64 20 61 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74  d at pgno is not
306e0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74   already.** in t
306f0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
30700 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 70  nal, it is not p
30710 75 74 20 74 68 65 72 65 20 62 79 20 62 79 20 74  ut there by by t
30720 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
30730 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f  ** References to
30740 20 74 68 65 20 70 61 67 65 20 70 50 67 20 72 65   the page pPg re
30750 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61  main valid. Upda
30760 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61  ting any.** meta
30770 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64  -data associated
30780 20 77 69 74 68 20 70 50 67 20 28 69 2e 65 2e 20   with pPg (i.e. 
30790 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74  data stored in t
307a0 68 65 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a  he nExtra bytes.
307b0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f  ** allocated alo
307c0 6e 67 20 77 69 74 68 20 74 68 65 20 70 61 67 65  ng with the page
307d0 29 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  ) is the respons
307e0 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
307f0 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  aller..**.** A t
30800 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
30810 62 65 20 61 63 74 69 76 65 20 77 68 65 6e 20 74  be active when t
30820 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
30830 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74  alled. It used t
30840 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  o be.** required
30850 20 74 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e   that a statemen
30860 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  t transaction wa
30870 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75  s not active, bu
30880 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69  t this restricti
30890 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72  on.** has been r
308a0 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20 49  emoved (CREATE I
308b0 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f  NDEX needs to mo
308c0 76 65 20 61 20 70 61 67 65 20 77 68 65 6e 20 61  ve a page when a
308d0 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72   statement.** tr
308e0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
308f0 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ive)..**.** If t
30900 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65  he fourth argume
30910 6e 74 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 69 73  nt, isCommit, is
30920 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
30930 74 68 69 73 20 70 61 67 65 20 69 73 20 62 65 69  this page is bei
30940 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20 61 73 20 70  ng.** moved as p
30950 61 72 74 20 6f 66 20 61 20 64 61 74 61 62 61 73  art of a databas
30960 65 20 72 65 6f 72 67 61 6e 69 7a 61 74 69 6f 6e  e reorganization
30970 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68 65   just before the
30980 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a   transaction .**
30990 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74   is being commit
309a0 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ted. In this cas
309b0 65 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  e, it is guarant
309c0 65 65 64 20 74 68 61 74 20 74 68 65 20 64 61 74  eed that the dat
309d0 61 62 61 73 65 20 70 61 67 65 20 0a 2a 2a 20 70  abase page .** p
309e0 50 67 20 72 65 66 65 72 73 20 74 6f 20 77 69 6c  Pg refers to wil
309f0 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e  l not be written
30a00 20 74 6f 20 61 67 61 69 6e 20 77 69 74 68 69 6e   to again within
30a10 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
30a20 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  n..**.** This fu
30a30 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72  nction may retur
30a40 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f  n SQLITE_NOMEM o
30a50 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  r an IO error co
30a60 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a  de if an error.*
30a70 2a 20 6f 63 63 75 72 73 2e 20 4f 74 68 65 72 77  * occurs. Otherw
30a80 69 73 65 2c 20 69 74 20 72 65 74 75 72 6e 73 20  ise, it returns 
30a90 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
30aa0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  t sqlite3PagerMo
30ab0 76 65 70 61 67 65 28 50 61 67 65 72 20 2a 70 50  vepage(Pager *pP
30ac0 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a 70 50  ager, DbPage *pP
30ad0 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 69 6e  g, Pgno pgno, in
30ae0 74 20 69 73 43 6f 6d 6d 69 74 29 7b 0a 20 20 50  t isCommit){.  P
30af0 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 20 20  gHdr *pPgOld;   
30b00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
30b10 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 6f 76  he page being ov
30b20 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20  erwritten. */.  
30b30 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e  Pgno needSyncPgn
30b40 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  o = 0;       /* 
30b50 4f 6c 64 20 76 61 6c 75 65 20 6f 66 20 70 50 67  Old value of pPg
30b60 2d 3e 70 67 6e 6f 2c 20 69 66 20 73 79 6e 63 20  ->pgno, if sync 
30b70 69 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  is required */. 
30b80 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
30b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30ba0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
30bb0 20 20 50 67 6e 6f 20 6f 72 69 67 50 67 6e 6f 3b    Pgno origPgno;
30bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30bd0 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  * The original p
30be0 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20  age number */.. 
30bf0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
30c00 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ef>0 );..  /* If
30c10 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
30c20 6d 6f 76 65 64 20 69 73 20 64 69 72 74 79 20 61  moved is dirty a
30c30 6e 64 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  nd has not been 
30c40 73 61 76 65 64 20 62 79 20 74 68 65 20 6c 61 74  saved by the lat
30c50 65 73 74 0a 20 20 2a 2a 20 73 61 76 65 70 6f 69  est.  ** savepoi
30c60 6e 74 2c 20 74 68 65 6e 20 73 61 76 65 20 74 68  nt, then save th
30c70 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e  e current conten
30c80 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  ts of the page i
30c90 6e 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20 73 75  nto the .  ** su
30ca0 62 2d 6a 6f 75 72 6e 61 6c 20 6e 6f 77 2e 20 54  b-journal now. T
30cb0 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
30cc0 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 66 6f  to handle the fo
30cd0 6c 6c 6f 77 69 6e 67 20 73 63 65 6e 61 72 69 6f  llowing scenario
30ce0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 42 45  :.  **.  **   BE
30cf0 47 49 4e 3b 0a 20 20 2a 2a 20 20 20 20 20 3c 6a  GIN;.  **     <j
30d00 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 2c 20 74  ournal page X, t
30d10 68 65 6e 20 6d 6f 64 69 66 79 20 69 74 20 69 6e  hen modify it in
30d20 20 6d 65 6d 6f 72 79 3e 0a 20 20 2a 2a 20 20 20   memory>.  **   
30d30 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b    SAVEPOINT one;
30d40 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c 4d 6f 76  .  **       <Mov
30d50 65 20 70 61 67 65 20 58 20 74 6f 20 6c 6f 63 61  e page X to loca
30d60 74 69 6f 6e 20 59 3e 0a 20 20 2a 2a 20 20 20 20  tion Y>.  **    
30d70 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65   ROLLBACK TO one
30d80 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ;.  **.  ** If p
30d90 61 67 65 20 58 20 77 65 72 65 20 6e 6f 74 20 77  age X were not w
30da0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 75  ritten to the su
30db0 62 2d 6a 6f 75 72 6e 61 6c 20 68 65 72 65 2c 20  b-journal here, 
30dc0 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a  it would not.  *
30dd0 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  * be possible to
30de0 20 72 65 73 74 6f 72 65 20 69 74 73 20 63 6f 6e   restore its con
30df0 74 65 6e 74 73 20 77 68 65 6e 20 74 68 65 20 22  tents when the "
30e00 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 22  ROLLBACK TO one"
30e10 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
30e20 77 65 72 65 20 69 73 20 70 72 6f 63 65 73 73 65  were is processe
30e30 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73 75 62  d..  **.  ** sub
30e40 6a 6f 75 72 6e 61 6c 50 61 67 65 28 29 20 6d 61  journalPage() ma
30e50 79 20 6e 65 65 64 20 74 6f 20 61 6c 6c 6f 63 61  y need to alloca
30e60 74 65 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72  te space to stor
30e70 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 74 6f  e pPg->pgno into
30e80 0a 20 20 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72  .  ** one or mor
30e90 65 20 73 61 76 65 70 6f 69 6e 74 20 62 69 74 76  e savepoint bitv
30ea0 65 63 73 2e 20 54 68 69 73 20 69 73 20 74 68 65  ecs. This is the
30eb0 20 72 65 61 73 6f 6e 20 74 68 69 73 20 66 75 6e   reason this fun
30ec0 63 74 69 6f 6e 0a 20 20 2a 2a 20 6d 61 79 20 72  ction.  ** may r
30ed0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
30ee0 45 4d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  EM..  */.  if( p
30ef0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
30f00 44 49 52 54 59 20 0a 20 20 20 26 26 20 73 75 62  DIRTY .   && sub
30f10 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
30f20 67 29 0a 20 20 20 26 26 20 53 51 4c 49 54 45 5f  g).   && SQLITE_
30f30 4f 4b 21 3d 28 72 63 20 3d 20 73 75 62 6a 6f 75  OK!=(rc = subjou
30f40 72 6e 61 6c 50 61 67 65 28 70 50 67 29 29 0a 20  rnalPage(pPg)). 
30f50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
30f60 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54  c;.  }..  PAGERT
30f70 52 41 43 45 28 28 22 4d 4f 56 45 20 25 64 20 70  RACE(("MOVE %d p
30f80 61 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63  age %d (needSync
30f90 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64  =%d) moves to %d
30fa0 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45  \n", .      PAGE
30fb0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
30fc0 2d 3e 70 67 6e 6f 2c 20 28 70 50 67 2d 3e 66 6c  ->pgno, (pPg->fl
30fd0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
30fe0 59 4e 43 29 3f 31 3a 30 2c 20 70 67 6e 6f 29 29  YNC)?1:0, pgno))
30ff0 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f  ;.  IOTRACE(("MO
31000 56 45 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20  VE %p %d %d\n", 
31010 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
31020 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 2f 2a 20  o, pgno))..  /* 
31030 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e  If the journal n
31040 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28  eeds to be sync(
31050 29 65 64 20 62 65 66 6f 72 65 20 70 61 67 65 20  )ed before page 
31060 70 50 67 2d 3e 70 67 6e 6f 20 63 61 6e 0a 20 20  pPg->pgno can.  
31070 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  ** be written to
31080 2c 20 73 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e  , store pPg->pgn
31090 6f 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61  o in local varia
310a0 62 6c 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  ble needSyncPgno
310b0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
310c0 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67  he isCommit flag
310d0 20 69 73 20 73 65 74 2c 20 74 68 65 72 65 20 69   is set, there i
310e0 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d  s no need to rem
310f0 65 6d 62 65 72 20 74 68 61 74 0a 20 20 2a 2a 20  ember that.  ** 
31100 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64  the journal need
31110 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64  s to be sync()ed
31120 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65   before database
31130 20 70 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20   page pPg->pgno 
31140 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 77 72 69  .  ** can be wri
31150 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c  tten to. The cal
31160 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ler has already 
31170 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20  promised not to 
31180 77 72 69 74 65 20 74 6f 20 69 74 2e 0a 20 20 2a  write to it..  *
31190 2f 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66 6c  /.  if( (pPg->fl
311a0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
311b0 59 4e 43 29 20 26 26 20 21 69 73 43 6f 6d 6d 69  YNC) && !isCommi
311c0 74 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e  t ){.    needSyn
311d0 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e  cPgno = pPg->pgn
311e0 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  o;.    assert( p
311f0 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67  ageInJournal(pPg
31200 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70  ) || pPg->pgno>p
31210 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
31220 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
31230 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
31240 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 20 20 61  R_DIRTY );.    a
31250 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
31260 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a  eedSync );.  }..
31270 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68    /* If the cach
31280 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 67  e contains a pag
31290 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62  e with page-numb
312a0 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20  er pgno, remove 
312b0 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 73  it.  ** from its
312c0 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73   hash chain. Als
312d0 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64 72 2e  o, if the PgHdr.
312e0 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73 65 74  needSync was set
312f0 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 20   for .  ** page 
31300 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68 65 20  pgno before the 
31310 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69 6f 6e  'move' operation
31320 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  , it needs to be
31330 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20   retained .  ** 
31340 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d 6f 76  for the page mov
31350 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20  ed there..  */. 
31360 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e   pPg->flags &= ~
31370 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
31380 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65  .  pPgOld = page
31390 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
313a0 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74   pgno);.  assert
313b0 28 20 21 70 50 67 4f 6c 64 20 7c 7c 20 70 50 67  ( !pPgOld || pPg
313c0 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a  Old->nRef==1 );.
313d0 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a    if( pPgOld ){.
313e0 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
313f0 3d 20 28 70 50 67 4f 6c 64 2d 3e 66 6c 61 67 73  = (pPgOld->flags
31400 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
31410 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  );.    sqlite3Pc
31420 61 63 68 65 44 72 6f 70 28 70 50 67 4f 6c 64 29  acheDrop(pPgOld)
31430 3b 0a 20 20 7d 0a 0a 20 20 6f 72 69 67 50 67 6e  ;.  }..  origPgn
31440 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  o = pPg->pgno;. 
31450 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 6f   sqlite3PcacheMo
31460 76 65 28 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20  ve(pPg, pgno);. 
31470 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
31480 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20  keDirty(pPg);.  
31490 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
314a0 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e  ed = 1;..  if( n
314b0 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20  eedSyncPgno ){. 
314c0 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e     /* If needSyn
314d0 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72  cPgno is non-zer
314e0 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  o, then the jour
314f0 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74  nal file needs t
31500 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e  o be .    ** syn
31510 63 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79  c()ed before any
31520 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
31530 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c   to database fil
31540 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50  e page needSyncP
31550 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72  gno..    ** Curr
31560 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70  ently, no such p
31570 61 67 65 20 65 78 69 73 74 73 20 69 6e 20 74 68  age exists in th
31580 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64  e page-cache and
31590 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 22 69 73   the .    ** "is
315a0 20 6a 6f 75 72 6e 61 6c 65 64 22 20 62 69 74 76   journaled" bitv
315b0 65 63 20 66 6c 61 67 20 68 61 73 20 62 65 65 6e  ec flag has been
315c0 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64 73   set. This needs
315d0 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64 20   to be remedied 
315e0 62 79 0a 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e  by.    ** loadin
315f0 67 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  g the page into 
31600 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
31610 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65 20  and setting the 
31620 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 0a  PgHdr.needSync .
31630 20 20 20 20 2a 2a 20 66 6c 61 67 2e 0a 20 20 20      ** flag..   
31640 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
31650 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61  e attempt to loa
31660 64 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  d the page into 
31670 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 66  the page-cache f
31680 61 69 6c 73 2c 20 28 64 75 65 0a 20 20 20 20 2a  ails, (due.    *
31690 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 28 29 20  * to a malloc() 
316a0 6f 72 20 49 4f 20 66 61 69 6c 75 72 65 29 2c 20  or IO failure), 
316b0 63 6c 65 61 72 20 74 68 65 20 62 69 74 20 69 6e  clear the bit in
316c0 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e 61 6c 5b   the pInJournal[
316d0 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61 79 2e 20  ].    ** array. 
316e0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
316f0 65 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64  e page is loaded
31700 20 61 6e 64 20 77 72 69 74 74 65 6e 20 61 67 61   and written aga
31710 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 69  in in.    ** thi
31720 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  s transaction, i
31730 74 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e  t may be written
31740 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
31750 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 20 20 20   file before.   
31760 20 2a 2a 20 69 74 20 69 73 20 73 79 6e 63 65 64   ** it is synced
31770 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
31780 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 77 61 79  l file. This way
31790 2c 20 69 74 20 6d 61 79 20 65 6e 64 20 75 70 20  , it may end up 
317a0 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  in.    ** the jo
317b0 75 72 6e 61 6c 20 66 69 6c 65 20 74 77 69 63 65  urnal file twice
317c0 2c 20 62 75 74 20 74 68 61 74 20 69 73 20 6e 6f  , but that is no
317d0 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 20  t a problem..   
317e0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
317f0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
31800 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20   call may cause 
31810 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73  the journal to s
31820 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20  ync. So make.   
31830 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61 67   ** sure the Pag
31840 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
31850 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20   is set too..   
31860 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a 70   */.    PgHdr *p
31870 50 67 48 64 72 3b 0a 20 20 20 20 61 73 73 65 72  PgHdr;.    asser
31880 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
31890 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ync );.    rc = 
318a0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
318b0 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63  pPager, needSync
318c0 50 67 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b 0a  Pgno, &pPgHdr);.
318d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
318e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
318f0 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 3c  f( needSyncPgno<
31900 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
31910 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ize ){.        a
31920 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
31930 54 6d 70 53 70 61 63 65 21 3d 30 20 29 3b 0a 20  TmpSpace!=0 );. 
31940 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69         sqlite3Bi
31950 74 76 65 63 43 6c 65 61 72 28 70 50 61 67 65 72  tvecClear(pPager
31960 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65  ->pInJournal, ne
31970 65 64 53 79 6e 63 50 67 6e 6f 2c 20 70 50 61 67  edSyncPgno, pPag
31980 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  er->pTmpSpace);.
31990 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
319a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
319b0 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
319c0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 61 73 73  ync = 1;.    ass
319d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ert( pPager->noS
319e0 79 6e 63 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42  ync==0 && !MEMDB
319f0 20 29 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e   );.    pPgHdr->
31a00 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
31a10 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 73 71  EED_SYNC;.    sq
31a20 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
31a30 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20  irty(pPgHdr);.  
31a40 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
31a50 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d  ref(pPgHdr);.  }
31a60 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 6f 72 20  ..  /*.  ** For 
31a70 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
31a80 61 62 61 73 65 2c 20 6d 61 6b 65 20 73 75 72 65  abase, make sure
31a90 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
31aa0 67 65 20 63 6f 6e 74 69 6e 75 65 73 0a 20 20 2a  ge continues.  *
31ab0 2a 20 74 6f 20 65 78 69 73 74 2c 20 69 6e 20 63  * to exist, in c
31ac0 61 73 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ase the transact
31ad0 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 72 6f 6c  ion needs to rol
31ae0 6c 20 62 61 63 6b 2e 20 20 57 65 20 61 6c 6c 6f  l back.  We allo
31af0 63 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 70 61  cate.  ** the pa
31b00 67 65 20 6e 6f 77 2c 20 69 6e 73 74 65 61 64 20  ge now, instead 
31b10 6f 66 20 61 74 20 72 6f 6c 6c 62 61 63 6b 2c 20  of at rollback, 
31b20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 20 62  because we can b
31b30 65 74 74 65 72 20 64 65 61 6c 0a 20 20 2a 2a 20  etter deal.  ** 
31b40 77 69 74 68 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d  with an out-of-m
31b50 65 6d 6f 72 79 20 65 72 72 6f 72 20 6e 6f 77 2e  emory error now.
31b60 20 20 54 69 63 6b 65 74 20 23 33 37 36 31 2e 0a    Ticket #3761..
31b70 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42    */.  if( MEMDB
31b80 20 29 7b 0a 20 20 20 20 44 62 50 61 67 65 20 2a   ){.    DbPage *
31b90 70 4e 65 77 3b 0a 20 20 20 20 72 63 20 3d 20 73  pNew;.    rc = s
31ba0 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
31bb0 72 65 28 70 50 61 67 65 72 2c 20 6f 72 69 67 50  re(pPager, origP
31bc0 67 6e 6f 2c 20 26 70 4e 65 77 2c 20 31 29 3b 0a  gno, &pNew, 1);.
31bd0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31be0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
31bf0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 6f 76 65  qlite3PcacheMove
31c00 28 70 50 67 2c 20 6f 72 69 67 50 67 6e 6f 29 3b  (pPg, origPgno);
31c10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
31c20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
31c30 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4e  te3PagerUnref(pN
31c40 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ew);.  }..  retu
31c50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
31c60 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
31c70 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
31c80 6f 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  o the data for t
31c90 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
31ca0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  e..*/.void *sqli
31cb0 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
31cc0 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
31cd0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
31ce0 66 3e 30 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67  f>0 || pPg->pPag
31cf0 65 72 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20 20 72  er->memDb );.  r
31d00 65 74 75 72 6e 20 70 50 67 2d 3e 70 44 61 74 61  eturn pPg->pData
31d10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
31d20 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
31d30 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20  he Pager.nExtra 
31d40 62 79 74 65 73 20 6f 66 20 22 65 78 74 72 61 22  bytes of "extra"
31d50 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63   space .** alloc
31d60 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  ated along with 
31d70 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
31d80 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ge..*/.void *sql
31d90 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
31da0 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  a(DbPage *pPg){.
31db0 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 45    return pPg->pE
31dc0 78 74 72 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  xtra;.}../*.** G
31dd0 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b 69  et/set the locki
31de0 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73  ng-mode for this
31df0 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65   pager. Paramete
31e00 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20  r eMode must be 
31e10 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f  one.** of PAGER_
31e20 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52  LOCKINGMODE_QUER
31e30 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  Y, PAGER_LOCKING
31e40 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a  MODE_NORMAL or .
31e50 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  ** PAGER_LOCKING
31e60 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e 20  MODE_EXCLUSIVE. 
31e70 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  If the parameter
31e80 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20   is not _QUERY, 
31e90 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  then.** the lock
31ea0 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74 20  ing-mode is set 
31eb0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70 65  to the value spe
31ec0 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  cified..**.** Th
31ed0 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
31ee0 20 69 73 20 65 69 74 68 65 72 20 50 41 47 45 52   is either PAGER
31ef0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
31f00 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f  MAL or.** PAGER_
31f10 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
31f20 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69 6e  USIVE, indicatin
31f30 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 28 70  g the current (p
31f40 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64 29  ossibly updated)
31f50 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65  .** locking-mode
31f60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
31f70 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65  PagerLockingMode
31f80 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
31f90 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73  int eMode){.  as
31fa0 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47  sert( eMode==PAG
31fb0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51  ER_LOCKINGMODE_Q
31fc0 55 45 52 59 0a 20 20 20 20 20 20 20 20 20 20 20  UERY.           
31fd0 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
31fe0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
31ff0 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20  MAL.            
32000 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
32010 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
32020 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72  USIVE );.  asser
32030 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
32040 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a  MODE_QUERY<0 );.
32050 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
32060 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
32070 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52 5f 4c  AL>=0 && PAGER_L
32080 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
32090 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28  SIVE>=0 );.  if(
320a0 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70 50   eMode>=0 && !pP
320b0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
320c0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78  {.    pPager->ex
320d0 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75  clusiveMode = (u
320e0 38 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72  8)eMode;.  }.  r
320f0 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65  eturn (int)pPage
32100 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
32110 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73  ;.}../*.** Get/s
32120 65 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  et the journal-m
32130 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ode for this pag
32140 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d  er. Parameter eM
32150 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 20  ode must be one 
32160 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50 41 47  of:.**.**    PAG
32170 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51  ER_JOURNALMODE_Q
32180 55 45 52 59 0a 2a 2a 20 20 20 20 50 41 47 45 52  UERY.**    PAGER
32190 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
321a0 45 54 45 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f  ETE.**    PAGER_
321b0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
321c0 43 41 54 45 0a 2a 2a 20 20 20 20 50 41 47 45 52  CATE.**    PAGER
321d0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
321e0 53 49 53 54 0a 2a 2a 20 20 20 20 50 41 47 45 52  SIST.**    PAGER
321f0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
32200 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55  .**    PAGER_JOU
32210 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 0a  RNALMODE_MEMORY.
32220 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 72  **.** If the par
32230 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51  ameter is not _Q
32240 55 45 52 59 2c 20 74 68 65 6e 20 74 68 65 20 6a  UERY, then the j
32250 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 69 73 20 73  ournal_mode is s
32260 65 74 20 74 6f 20 74 68 65 0a 2a 2a 20 76 61 6c  et to the.** val
32270 75 65 20 73 70 65 63 69 66 69 65 64 20 69 66 20  ue specified if 
32280 74 68 65 20 63 68 61 6e 67 65 20 69 73 20 61 6c  the change is al
32290 6c 6f 77 65 64 2e 20 20 54 68 65 20 63 68 61 6e  lowed.  The chan
322a0 67 65 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64  ge is disallowed
322b0 0a 2a 2a 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c  .** for the foll
322c0 6f 77 69 6e 67 20 72 65 61 73 6f 6e 73 3a 0a 2a  owing reasons:.*
322d0 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 69 6e 2d  *.**   *  An in-
322e0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
322f0 63 61 6e 20 6f 6e 6c 79 20 68 61 76 65 20 69 74  can only have it
32300 73 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 73  s journal_mode s
32310 65 74 20 74 6f 20 5f 4f 46 46 0a 2a 2a 20 20 20  et to _OFF.**   
32320 20 20 20 6f 72 20 5f 4d 45 4d 4f 52 59 2e 0a 2a     or _MEMORY..*
32330 2a 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20 6a 6f  *.**   *  The jo
32340 75 72 6e 61 6c 20 6d 6f 64 65 20 6d 61 79 20 6e  urnal mode may n
32350 6f 74 20 62 65 20 63 68 61 6e 67 65 64 20 77 68  ot be changed wh
32360 69 6c 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ile a transactio
32370 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 0a  n is active..**.
32380 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
32390 69 6e 64 69 63 61 74 65 20 74 68 65 20 63 75 72  indicate the cur
323a0 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75  rent (possibly u
323b0 70 64 61 74 65 64 29 20 6a 6f 75 72 6e 61 6c 2d  pdated) journal-
323c0 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mode..*/.int sql
323d0 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c  ite3PagerJournal
323e0 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67  Mode(Pager *pPag
323f0 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a  er, int eMode){.
32400 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d    assert( eMode=
32410 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
32420 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20  DE_QUERY.       
32430 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
32440 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
32450 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20  _DELETE.        
32460 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
32470 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
32480 54 52 55 4e 43 41 54 45 0a 20 20 20 20 20 20 20  TRUNCATE.       
32490 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
324a0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
324b0 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20 20 20  _PERSIST.       
324c0 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
324d0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
324e0 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20  _OFF .          
324f0 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
32500 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
32510 4d 4f 52 59 20 29 3b 0a 20 20 61 73 73 65 72 74  MORY );.  assert
32520 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ( PAGER_JOURNALM
32530 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20  ODE_QUERY<0 );. 
32540 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 0a 20 20   if( eMode>=0.  
32550 20 26 26 20 28 21 4d 45 4d 44 42 20 7c 7c 20 65   && (!MEMDB || e
32560 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
32570 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
32580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
32590 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
325a0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 29 0a 20  URNALMODE_OFF). 
325b0 20 20 26 26 20 21 70 50 61 67 65 72 2d 3e 64 62    && !pPager->db
325c0 4d 6f 64 69 66 69 65 64 0a 20 20 20 26 26 20 28  Modified.   && (
325d0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
325e0 6a 66 64 29 20 7c 7c 20 30 3d 3d 70 50 61 67 65  jfd) || 0==pPage
325f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 0a 20  r->journalOff). 
32600 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 4f 70   ){.    if( isOp
32610 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
32620 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
32630 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
32640 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  jfd);.    }.    
32650 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
32660 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b  ode = (u8)eMode;
32670 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69  .  }.  return (i
32680 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  nt)pPager->journ
32690 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  alMode;.}../*.**
326a0 20 47 65 74 2f 73 65 74 20 74 68 65 20 73 69 7a   Get/set the siz
326b0 65 2d 6c 69 6d 69 74 20 75 73 65 64 20 66 6f 72  e-limit used for
326c0 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72   persistent jour
326d0 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  nal files..**.**
326e0 20 53 65 74 74 69 6e 67 20 74 68 65 20 73 69 7a   Setting the siz
326f0 65 20 6c 69 6d 69 74 20 74 6f 20 2d 31 20 6d 65  e limit to -1 me
32700 61 6e 73 20 6e 6f 20 6c 69 6d 69 74 20 69 73 20  ans no limit is 
32710 65 6e 66 6f 72 63 65 64 2e 0a 2a 2a 20 41 6e 20  enforced..** An 
32720 61 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 61  attempt to set a
32730 20 6c 69 6d 69 74 20 73 6d 61 6c 6c 65 72 20 74   limit smaller t
32740 68 61 6e 20 2d 31 20 69 73 20 61 20 6e 6f 2d 6f  han -1 is a no-o
32750 70 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65  p..*/.i64 sqlite
32760 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69 7a  3PagerJournalSiz
32770 65 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50  eLimit(Pager *pP
32780 61 67 65 72 2c 20 69 36 34 20 69 4c 69 6d 69 74  ager, i64 iLimit
32790 29 7b 0a 20 20 69 66 28 20 69 4c 69 6d 69 74 3e  ){.  if( iLimit>
327a0 3d 2d 31 20 29 7b 0a 20 20 20 20 70 50 61 67 65  =-1 ){.    pPage
327b0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
327c0 6d 69 74 20 3d 20 69 4c 69 6d 69 74 3b 0a 20 20  mit = iLimit;.  
327d0 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  }.  return pPage
327e0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
327f0 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  mit;.}../*.** Re
32800 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
32810 6f 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 42  o the pPager->pB
32820 61 63 6b 75 70 20 76 61 72 69 61 62 6c 65 2e 20  ackup variable. 
32830 54 68 65 20 62 61 63 6b 75 70 20 6d 6f 64 75 6c  The backup modul
32840 65 0a 2a 2a 20 69 6e 20 62 61 63 6b 75 70 2e 63  e.** in backup.c
32850 20 6d 61 69 6e 74 61 69 6e 73 20 74 68 65 20 63   maintains the c
32860 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 76  ontent of this v
32870 61 72 69 61 62 6c 65 2e 20 54 68 69 73 20 6d 6f  ariable. This mo
32880 64 75 6c 65 0a 2a 2a 20 75 73 65 73 20 69 74 20  dule.** uses it 
32890 6f 70 61 71 75 65 6c 79 20 61 73 20 61 6e 20 61  opaquely as an a
328a0 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74  rgument to sqlit
328b0 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
328c0 29 20 61 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33  ) and.** sqlite3
328d0 42 61 63 6b 75 70 55 70 64 61 74 65 28 29 20 6f  BackupUpdate() o
328e0 6e 6c 79 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  nly..*/.sqlite3_
328f0 62 61 63 6b 75 70 20 2a 2a 73 71 6c 69 74 65 33  backup **sqlite3
32900 50 61 67 65 72 42 61 63 6b 75 70 50 74 72 28 50  PagerBackupPtr(P
32910 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
32920 20 72 65 74 75 72 6e 20 26 70 50 61 67 65 72 2d   return &pPager-
32930 3e 70 42 61 63 6b 75 70 3b 0a 7d 0a 0a 23 65 6e  >pBackup;.}..#en
32940 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
32950 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a           IT_DISKIO */.